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)
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)
这两个被投票的答案在这里都非常危险,都容易受到注入攻击,不应该使用。
注入动态对象名称时,您必须确保正确引用对象名称。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
归档时间: |
|
查看次数: |
67905 次 |
最近记录: |