使用SQL_VARIANT数据类型参数化动态SQL问题

时间:2009-11-13 23:09:39

标签: sql sql-server tsql dynamic-sql

我一直在重构一个巨大的动态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;

这导致:

  

从数据类型隐式转换   不允许使用sql_variant到varchar。   使用CONVERT函数运行它   查询。

如果我能以某种方式将@updateValue转换为正确的类型,我可以解决这个问题,我已将其存储为@updateClauseDataType中的文本。有没有办法可以做到这一点,而没有一个巨大的if语句来询问@updateClauseDataType的价值?

1 个答案:

答案 0 :(得分:1)

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

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

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

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