我正在重构一个巨大的动态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语句来询问
@更新子句状态类型
?