我想知道原因,当我们在更新,删除或插入时创建存储过程
update TABLE_NAME set column_name = @variable_name
没关系。
为什么我们不能传递参数或变量来选择
select @column_variable from @table_variable
我知道,作为一种解决方法,你需要使用动态SQL,但是什么原因它不起作用?
答案 0 :(得分:1)
如果这是关于SQL Server的,那么你不能用这个语句参数化列名和表名,
select @column_variable from @table_variable
是因为它已经是一个有效的语句并以不同的方式解释:
@name
将被解释为对标量变量的引用,该变量的值将作为数据集列返回;
@name
将被解释为表变量名称,即table
类型变量的名称。
在每种情况下,使用@name
来表示一个参数,其中包含要从中选择的实际列或表的名称,只会非常混淆。
另一方面,人们可能会认为可以为此设计一种不同的语法(即专门用于名称的参数化),但它没有。
我的观点(我必须承认这只是我的意见)为什么没有这样的语法是通过将参数化名称构建到SQL中,您可能最终会得到效率较低的查询规划器。如果在查询编译时你不知道查询试图选择什么和哪个,你就不能真正为它构建一个真正有效的计划,可以吗。
当然,构建查询计划可能会延迟到评估名称参数的时间,但计划程序每次调用此类查询时都必须构建计划,与现在不同,当查询计划存储一次然后多次使用时。