执行sp_executesql,表变量未声明

时间:2014-08-10 11:56:54

标签: sql sql-server

我正在使用SQL Server 2012,我希望通过在此查询中应用where条件来从我的表中选择随机列:

EXECUTE sp_executesql
          N'SELECT * 
            FROM @table
            WHERE @Col = @Value',
            N'@Value nvarchar(44),@table nvarchar(55),@Col nvarchar(30)',
            @Value = 'Cus_1',@Col='CustId',@table='SaleOrder';

但是当我执行它时,它显示错误

  

必须声明表变量" @ table"

我还尝试通过这个来声明:@table table(Id nvarchar(30)),但是它会再次显示表格类型错误...

请帮忙

1 个答案:

答案 0 :(得分:1)

这就是您要尝试运行的内容:

EXECUTE sp_executesql
      N'SELECT * FROM @table WHERE @Col = @Value',
      N'@Value nvarchar(44), @table nvarchar(55), @Col nvarchar(30)',
      @Value = 'Cus_1', @Col='CustId', @table='SaleOrder';

唉。您不能使用参数替换替换表名或列名。因此,SQL Server正在寻找一个名为@table的表变量。您可以通过将值直接放入字符串来解决此问题:

declare @Col = 'CustId', @table = 'SaleOrder';
declare @sql nvarchar(max) = N'SELECT * FROM ' + @table + ' WHERE ' + @Col + ' = @Value';

EXECUTE sp_executesql @sql,
      N'@Value nvarchar(44)',
      @Value = 'Cus_1';

不幸的是,我在文档中找不到一个很好的参考来解释发生了什么。编译语句时,允许使用参数。但是,参数适用于语句中的,而不适用于列,表,数据库或UDF名称或关键字。语句本身是编译的,带有参数的占位符,为了编译,SQL引擎需要解析所有对象名。