Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server t-sql存储过程将字段名作为参数传递_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql server t-sql存储过程将字段名作为参数传递

Sql server t-sql存储过程将字段名作为参数传递,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,存储过程可以从表1中选择Value1…,但我想动态更改列名。。。和Value1、Value2一样,我希望将@Field作为参数传递 我做错了什么,伙计们?提前谢谢 表1: 栏目: 位置-nvarchar50 值1-小数点18,2 值2-小数点18,2 代码: 我正在从对象资源管理器执行,在鼠标左键单击“执行存储过程”您需要使用动态SQL来执行此操作。例如: DECLARE @Query AS VARCHAR(MAX) SET @Query = 'SELECT [' + @Field + '] f

存储过程可以从表1中选择Value1…,但我想动态更改列名。。。和Value1、Value2一样,我希望将@Field作为参数传递

我做错了什么,伙计们?提前谢谢

表1:

栏目:

位置-nvarchar50 值1-小数点18,2 值2-小数点18,2 代码:


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

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

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

将发送另一个参数@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/如果您的查询变得更大,使用更多参数=>将很难管理它。 2/任何语法错误都将在设计时(即EXEC运行时)发现。 3/I将动态避免SQLs,即EXEC,因为查询计划的缓存方式不同。想象一下,服务器无法预先猜到字符串后面的内容。使用sp_executesql会更好,但在这种情况下不能使用。如果有人能在这里给出更多的解释,这将有所帮助。
这可能导致SQL注入。小心
(SELECT CONVERT(decimal(18,2),@Field) from ...
(SELECT ' + @Field +' from ...
DECLARE @Query AS VARCHAR(MAX)
SET @Query = 'SELECT [' + @Field + '] from Table1 WHERE Location= ''' + @Loc + ''''
EXECUTE(@Query)
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