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

时间:2018-03-31 14:58:36

标签: sql sql-server database

我正在尝试将列列表和表名作为参数传递给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;

1 个答案:

答案 0 :(得分:0)

您只能在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的一个好处是缓存了查询计划。这允许每次编译查询时使用相同的计划,从而节省编译时间。显然,需要知道要编译的查询表。可能不太清楚列需要知道,但它们也用于索引选择。