Chr*_*isA 1 t-sql sql-server syntax
他们为什么从不让我们这样做:
Create Proc RunParameterisedSelect
@tableName varchar(100),
@columnName varchar(100),
@value varchar(100)
as
select * from @tableName
where @columnName = @value
Run Code Online (Sandbox Code Playgroud)
@value显然,您可以将其用作参数,并且可以使用动态SQL实现整个过程,但创建它总是一件痛苦的事.
那么他们为什么不以某种方式将它作为语言的一部分,而不是强迫你EXEC(@sql)呢?
很简单,因为这样的事情是不可能的.这有点像问"为什么这个JavaScript语法永远不会实现":
var operator = "<";
var statement = "if"
var op1 = 4
statement (op1 operator 5) op1++; // whatever
Run Code Online (Sandbox Code Playgroud)
它从未被实现,因为这是不可实现的,坦率地说,它没有任何意义.JavaScript具有eval()动态代码:
code = statement+" (op1 "+operator+" 5) op1++;";
eval( code );
Run Code Online (Sandbox Code Playgroud)
SQL Server具有EXECUTE动态SQL:
/* example only, it is not recommendable to actually *do* this */
Create Proc RunParameterisedSelect
@tableName varchar(100),
@columnName varchar(100),
@value varchar(100)
as
begin
declare @code varchar(8000)
set @code = 'select * from ['+@tableName+'] where ['+@columnName+'] = '+@value
exec (@code)
end
Run Code Online (Sandbox Code Playgroud)
本质是相同的 - 如果它不是一个固定的,不可变的代码结构(并且表或列名是SQL中的代码,而不是变量),那么你必须先将字符串输出并解析它.解释器/编译器必须构建一个新的语法树(当然,它本身将再次修复).
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |