【发布时间】:2009-11-13 23:09:39
【问题描述】:
我一直在重构一个巨大的动态 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 的值?
【问题讨论】:
标签: sql sql-server tsql dynamic-sql