将参数传递给sp_executesql

时间:2015-08-11 07:44:10

标签: sql-server tsql dynamic-sql 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列的实际值。我没有正确传递参数吗?

1 个答案:

答案 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 - 这也是您使用参数时发生的事情。