2009-11-13 61 views
0

我一直在重构一个巨大的动态SQL语句,并认为我可能遇到了障碍。目标是将其参数化。我正在使用SQL Server 2005.使用SQL_VARIANT数据类型参数化动态SQL问题

我有一个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

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

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

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

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

我不认为这是在哪里,这是在发生 - 它在“设置”中的一个,读密切。另外,如果myfield被编入索引,这将会提高性能,因为索引无法高效使用... – 2009-11-13 23:21:25

+0

是的,在重读时注意到了,我编辑了答案 – Andomar 2009-11-13 23:22:42