代码之家  ›  专栏  ›  技术社区  ›  Aaron Daniels

使用sql_variant数据类型参数化动态sql问题

  •  0
  • Aaron Daniels  · 技术社区  · 15 年前

    我正在重构一个巨大的动态SQL语句,我想我可能遇到了一个障碍。目标是参数化它。我正在使用SQL Server 2005。

    我有一个int变量( @i )这决定了我需要更新哪个列。我一直在做的是:

    if @i = 1
     begin
      set @updateClause = 'Column1 = @newValue';
      set @updateClauseDataType = 'varchar(10)';
      set @updateValue = @foo;      
     end
    else if @i = 2
     begin
      set @updateClause = 'Column2 = @newValue';
      set @updateClauseDataType = 'int';
      set @updateValue = @bar;      
     end
    else if ...
    

    然后,我尝试执行我的语句:

    set @statement = N'update ' + @server_name + '.' + @database_name + '.dbo.Table1 
      set ' + @updateClause + ' where pk = @pk';
    
    set @parameters = '@newValue ' + @updateClauseDataType + ',      
     @pk uniqueidentifier';
    
    
    execute sp_executesql @statement, 
     @parameters,
     @newValue = @newValue,
     @pk= @pk;
    

    这将导致:

    从数据类型隐式转换 不允许使用varchar的sql_变量。 使用convert函数运行此 查询。

    如果我能用某种方法 @updateValue 输入正确的类型,并将其作为文本存储在 @updateClauseDataType . 如果没有一个巨大的if语句来询问 @更新子句状态类型 ?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Andomar    15 年前

    在重读时,既然您已经知道数据类型,为什么不将它包含在update子句中呢?

    set @updateClause = 'Column1 = cast(@newValue as varchar(10))';
    set @updateClauseDataType = 'varchar(10)';
    

    或者避免两次键入数据类型:

    set @updateClauseDataType = 'varchar(10)';
    set @updateClause = 'Column1 = cast(@newValue as ' +
        @updateClauseDataType + ')';