SQL:根据变量选择动态列名

时间:2011-04-12 15:45:07

标签: sql sql-server stored-procedures

我有一个Microsoft SQL存储过程,其列名我想通过传递给它的变量来设置:

CREATE PROCEDURE [My_Procedure]
   @myDynamicColumn varchar(50)
AS BEGIN
   SELECT 'value' AS @myDynamicColumn
END

这不起作用(“语法不正确”)。如果我用[]:

包装列名
SELECT 'value' AS [@myDynamicColumn]

列名称字面输出为'@myDynamicColumn'而不是实际值。有没有办法做到这一点?我已经研究过动态SQL文章,但没有什么是我要求的。

3 个答案:

答案 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 在内部用于对象名称的数据类型。