2009-11-13 23 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