关于存储过程参数的SQL查询

时间:2013-01-12 15:46:46

标签: sql

我想知道原因,当我们在更新,删除或插入时创建存储过程

update TABLE_NAME set column_name = @variable_name  

没关系。

为什么我们不能传递参数或变量来选择

select @column_variable from @table_variable

我知道,作为一种解决方法,你需要使用动态SQL,但是什么原因它不起作用?

1 个答案:

答案 0 :(得分:1)

如果这是关于SQL Server的,那么你不能用这个语句参数化列名和表名,

select @column_variable from @table_variable

是因为它已经是一个有效的语句并以不同的方式解释:

  • @name将被解释为对标量变量的引用,该变量的值将作为数据集列返回;

  • @name将被解释为表变量名称,即table类型变量的名称。

在每种情况下,使用@name来表示一个参数,其中包含要从中选择的实际列或表的名称,只会非常混淆。

另一方面,人们可能会认为可以为此设计一种不同的语法(即专门用于名称的参数化),但它没有。

我的观点(我必须承认这只是我的意见)为什么没有这样的语法是通过将参数化名称构建到SQL中,您可能最终会得到效率较低的查询规划器。如果在查询编译时你不知道查询试图选择什么和哪个,你就不能真正为它构建一个真正有效的计划,可以吗。

当然,构建查询计划可能会延迟到评估名称参数的时间,但计划程序每次调用此类查询时都必须构建计划,与现在不同,当查询计划存储一次然后多次使用时。