我有这个简单的动态SQL代码:
declare @cmd nvarchar(100)
declare @paramDef nvarchar(100) = N'@p nvarchar(20)'
declare @p nvarchar(10) = N'SubTotal'
set @cmd = N'select @p from Sales.SalesOrderHeader'
exec sp_executesql @cmd, @paramDef, @p
但是,运行此操作将输出包含重复单词"SubTotal"的列,而不是SubTotal列的实际值。我没有正确传递参数吗?
不能为表名或列名使用参数。您必须修改实际的SQL:
declare @cmd nvarchar(100)
declare @p nvarchar(10) = N'SubTotal'
set @cmd = N'select ' + QUOTENAME(@p) + N' from Sales.SalesOrderHeader'
exec sp_executesql @cmd
在select语句中包含常量值是完全有效的,这与您的尝试类似(只是使用参数而不是文字值)。希望您不会(太)惊讶,像:
这样的查询select 'abc' from sys.objects
只会返回字符串abc
多次-这就是当你使用你的参数时发生的事情。