我有这个简单的动态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列的实际值。我没有正确传递参数吗?
答案 0 :(得分:2)
您不能使用表名或列名参数。您必须修改实际的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
- 这也是您使用参数时发生的事情。