我有一个Microsoft SQL存储过程,其列名我想通过传递给它的变量来设置:
CREATE PROCEDURE [My_Procedure]
@myDynamicColumn varchar(50)
AS BEGIN
SELECT 'value' AS @myDynamicColumn
END
这不起作用(“语法不正确”)。如果我用[]:
包装列名SELECT 'value' AS [@myDynamicColumn]
列名称字面输出为'@myDynamicColumn'而不是实际值。有没有办法做到这一点?我已经研究过动态SQL文章,但没有什么是我要求的。
答案 0 :(得分:38)
EXEC ('SELECT ''value'' AS ' + @myDynamicColumn)
答案 1 :(得分:22)
您可以将查询构建为字符串并使用exec
CREATE PROCEDURE [My_Procedure]
@myDynamicColumn varchar(50)
AS BEGIN
EXEC('SELECT ''value'' AS ' + @myDynamicColumn)
END
答案 2 :(得分:1)
两个赞成的答案在这里非常危险,两者都对注入攻击敞开大门,应该不要使用。
在注入动态对象名称时,您必须确保正确引用您的对象名称。 SQL Server 有一个内置函数 QUOTENAME
。因此,您实际上应该做的是以下内容:
CREATE PROCEDURE [My_Procedure] @myDynamicColumn sysname
AS BEGIN
DECLARE @SQL nvarchar(MAX) = N'SELECT ''value'' AS ' + QUOTENAME(@myDynamicColumn) + N';';
EXEC sys.sp_executesql @SQL;
END
您会注意到我还将参数的数据类型更改为 sysname
,这是 nvarchar(128) NOT NULL
的同义词,这是 SQL Server 在内部用于对象名称的数据类型。