2017-01-04 84 views
0

我一直堅持與SQL的問題,關於更新表(無法找到答案任何地方)。SQL更新 - 變量

問題看起來像:

Update TABLE1 
    SET @variable1 = @variable2 
    WHERE SomeColumn = @variable3; 

當變量1和variable3爲varchar(50)的類型,變量2爲int的類型。我怎樣才能使這個工作?我一直在嘗試使用EXEC或許多其他簡單的選項,但它們似乎不適合我。

在這裏給出的代碼示例中,variable2的值被賦值給變量1,而不是名稱等於變量1的列,當我嘗試使用Exec時,它無法讀取變量2(因爲int類型)正常。

+0

該查詢沒有意義。它在做什麼? –

+0

我應該編寫一個程序,使表看起來不同(與我將使用PIVOT,但我不能使用該操作相同),這就是爲什麼最後我需要更新3個變量表。在這篇文章下的答案正在......但在我的程序中似乎還有另一個問題......「消息207,等級16,狀態1,行85 列名'Doors'無效。」不知道爲什麼SQL,而不是將它看作行的值,在名爲SomeColumn的列中,它正在尋找名稱爲「Doors」的列... Ps.I SomeColumn列下有一個記錄門:/ – SigKillMe

回答

0
DECLARE @variable1 varchar(50) 
DECLARE @variable2 varchar(50) 
DECLARE @variable3 varchar(50) 
DECLARE @Sql varchar(max) 

SET @variable1 = col1 

Set @sql = 'Update TABLE1 SET' + @variable1 +' ='+ @variable2 + 
    'WHERE SomeColumn = '+ @variable3 

EXEC (@Sql) 

如果需要動態設置@變量1

0

你需要使用動態SQL:

declare @sql nvarchar(max); 

set @sql = ' 
Update TABLE1 
    SET @variable1 = @variable2 
    WHERE SomeColumn = @variable3'; 

set @sql = replace(@sql, '@variable1', @variable1); 

exec sp_executesql @sql, 
        N'@variable2 int, @variable3 varchar(50)', 
        @variable2 = @variable2, @variable3 = @variable3; 

注:replace()被使用,因爲標識符(表名,列名,函數調用等)不能被參數來表示。

0

此查詢不去做你認爲它!當您在參數@ Variable1中提供值「Doors」時,您會看到「門」錯誤。 @ Variable1必須是TABLE1中的有效列名稱。 SomeColumn與它無關。

無論何時在運行時決定模式元素(列名,表名),您需要使用字符串方法動態構建您的sql,如其他答案所述。我想說,這是總是一個壞主意。你從來沒有必須這樣做。你不應該爲變量添加有意義的名稱,這會增加混淆。你可能這樣做是因爲在設計時,除了變量之外,你不知道變量的任何內容。這對我來說是一個明確的信號,表明你試圖用一個查詢做太多。沒有人會在你能夠維護這些代碼之後出現。你可能會忘記當你寫它時你想要做什麼。 (如果你堅持下去的話,我仍然不清楚你可以到哪裏去。

+0

那麼這個命名模式只是針對堆棧的溢出問題做出的。在我真正的問題中,我有一些常用的colums名稱,我只是不想用這種不同的語言來表達一些奇怪的單詞,因爲它應該是簡單易懂的例子; d 順便說一句,找到了我的問題的答案。每次我把變量,我不得不像EXEC這樣的東西:「...'''+ @ variable +'''...」,它爲我工作;) 感謝您的幫助和時間 – SigKillMe