t-sql存储过程将FIELD名称作为参数传递

时间:2014-04-17 13:55:48

标签: sql-server tsql stored-procedures

存储过程适用于SELECT Value1 from Table1...,但我想动态更改列名...就像Value1 , Value2所以我想传递(@Field)作为参数。< / p>

我做错了什么?提前谢谢。

Table1

ID   | Location   | Value1   | Value2
---------------------------------------
 1       L01         123.00     234.00
 2       L02         234.00     456.00
 3       L03         456.00     234.00

列:

  • Location - nvarchar(50)
  • Value1 - decimal(18, 2)
  • Value2 - decimal(18,2)

代码:

ALTER PROCEDURE [dbo].[sp_GetFieldValue]
    @Loc nvarchar(50),
    @Field nvarchar(50),   <--------- Error converting data type nvarchar to numeric.
    @Field_Out decimal(18,2) OUTPUT
AS
BEGIN  
    SET NOCOUNT ON;
    SET @Field_Out = (SELECT @Field from Table1 WHERE Location=@Loc)
END

我尝试过没有结果:

(SELECT CONVERT(decimal(18,2),@Field) from ...
(SELECT ' + @Field +' from ...

我正在从对象资源管理器执行,在鼠标右键单击“执行存储过程”

2 个答案:

答案 0 :(得分:0)

您需要使用动态SQL来执行此操作。例如:

DECLARE @Query AS VARCHAR(MAX)
SET @Query = 'SELECT [' + @Field + '] from Table1 WHERE Location= ''' + @Loc + ''''
EXECUTE(@Query)

答案 1 :(得分:0)

一个想法会被发送另一个参数@Field_No,表示要返回的字段。

ALTER PROCEDURE [dbo].[sp_GetFieldValue]
@Loc nvarchar(50),
@Field_No TINYINT,
@Field_Out decimal(18,2) OUTPUT
AS
BEGIN  
    SET NOCOUNT ON;

    SELECT @Field_Out = CASE Field_No
                        WHEN 1 THEN Value1
                        WHEN 2 THEN Value2
                    END    
    FROM Table1
    WHERE Location=@Loc
END

稍后编辑1:

@roryap提供的解决方案也是可行的,但要进行比较:

  • 1 /如果您的查询变大,参数更多=&gt;管理它会很困难。
  • 2 /将在设计时发现任何语法错误(也称为EXEC的运行时间)。
  • 3 /我会避免动态SQL(又名EXEC),因为查询计划的缓存方式不同。试想一下,服务器无法预测该字符串背后的内容。使用sp_executesql本来会更好,但在这种情况下您无法使用。如果有人能在这里给出更多解释,这将有所帮助。