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

dot*_*kow 23 sql sql-server stored-procedures

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

CREATE PROCEDURE [My_Procedure]
   @myDynamicColumn varchar(50)
AS BEGIN
   SELECT 'value' AS @myDynamicColumn
END
Run Code Online (Sandbox Code Playgroud)

这不起作用("语法不正确").如果我用[]包装列名:

SELECT 'value' AS [@myDynamicColumn]
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*lli 38

EXEC ('SELECT ''value'' AS ' + @myDynamicColumn)
Run Code Online (Sandbox Code Playgroud)

  • 永远是伴娘,永远不是新娘. (32认同)

Jos*_*osh 22

您可以将查询构建为字符串并使用exec

CREATE PROCEDURE [My_Procedure]
   @myDynamicColumn varchar(50)
AS BEGIN
   EXEC('SELECT ''value'' AS ' + @myDynamicColumn)
END
Run Code Online (Sandbox Code Playgroud)


use*_*983 6

这两个被投票的答案在这里都非常危险,都容易受到注入攻击,不应该使用

注入动态对象名称时,您必须确保正确引用对象名称。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
Run Code Online (Sandbox Code Playgroud)

您会注意到,我还将参数的数据类型更改为,它是 SQL Server 内部用于对象名称的数据类型的sysname同义词。nvarchar(128) NOT NULL