我正在使用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))
,但是它会再次显示表格类型错误...
请帮忙
答案 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引擎需要解析所有对象名。