代码之家  ›  专栏  ›  技术社区  ›  ChrisA

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

  •  1
  • ChrisA  · 技术社区  · 16 年前

    Create Proc RunParameterisedSelect
    
    @tableName   varchar(100),
    @columnName  varchar(100),
    @value       varchar(100)
    
    as
    
    select * from @tableName
    where @columnName = @value
    

    你可以用 @value

    那么,他们为什么不以某种方式让它成为语言的一部分,而不是强迫你这样做呢 EXEC(@sql)

    2 回复  |  直到 16 年前
        1
  •  5
  •   Tomalak    16 年前

    很简单,因为这样的事情是不可能的。这有点像在问,“为什么这个JavaScript语法从未实现过”:

    var operator  = "<";
    var statement = "if"
    var op1       = 4
    
    statement (op1 operator 5) op1++;  // whatever
    

    它从未被实现,因为这是不可实现的,坦白说,它没有任何意义。JavaScript已经 eval() 对于动态代码:

    code = statement+" (op1 "+operator+" 5) op1++;";
    eval( code );
    

    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
    

    本质是一样的——如果它不是一个固定的、不可变的代码结构(表或列名是 代码 在SQL(不是变量)中,则必须首先生成一个字符串并对其进行解析。解释器/编译器必须构建一个新的语法树(该树 它本身 当然会再次修复)。

        2
  •  0
  •   TomTom    16 年前