为什么这个T-SQL语法从未实现过?

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)呢?

Tom*_*lak 5

很简单,因为这样的事情是不可能的.这有点像问"为什么这个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中的代码,而不是变量),那么你必须先将字符串输出并解析它.解释器/编译器必须构建一个新的语法树(当然,它本身将再次修复).