将列列表名称和表名称作为参数传递给 sp_executesql

赛尔曼

我试图将列列表和表名作为参数传递给 sp_executesql 中提到的语句(查询)。

对于列名,它显示列名 n 次,而不是与该列对应的数据。对于表名,它不允许将其全部作为输入。

有办法吗?

declare @query nvarchar(max) = N'select @c from @t';
declare @col nchar(1) = 'x';
declare @table nchar(5) = 'sch.a'
exec sp_executesql @query, N'@c nchar(1)', N'@t nchar(5)', @c=@col, @t=@table;
戈登·利诺夫

您只能在 SQL 查询中参数化常量值。这意味着您不能参数化列名、表名、模式名、数据库名、函数和运算符。

因此,您不能使用参数做您想做的事。您必须修改查询字符串:

declare @query nvarchar(max) = N'select @c from @t';
declare @col nchar(1) = 'x';
declare @table nchar(5) = 'sch.a'

set @query = replace(replace(@query, '@c', @col), '@t', @table);

exec sp_executesql @query;

注意:您应该真正使用quotename()标识符来处理意外字符。此外,没有理由将变量声明为nchar(). 只需使用nvarchar(255)或类似的东西。

这似乎是一个神秘的限制,但有一个很好的理由。使用动态 SQL 的好处之一是查询计划被缓存。这允许每次编译查询时使用相同的计划,从而节省编译时间。显然,要编译查询需要知道该表。需要知道列可能不太清楚,但它们也用于索引选择。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章