代码之家  ›  专栏  ›  技术社区  ›  LynnXe

将参数传递到sp_executesql

  •  1
  • LynnXe  · 技术社区  · 9 年前

    我有一个简单的动态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 回复  |  直到 9 年前
        1
  •  2
  •   Damien_The_Unbeliever    9 年前

    不能将参数用于表或列名。您必须修改实际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 多次-这也是使用参数时发生的情况。