将参数传递给 sp_executesql

Passing parameters into sp_executesql

我有这个简单的动态 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 列的实际值。我是不是传参不对?

您不能为 table 或列名使用参数。你必须修改实际的 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

只会 return 字符串 abc 多次 - 这也是您使用参数时发生的情况。