2011-04-22 48 views
7

我正在分析存儲過程中的一些舊的SQL代碼。鏈接變量賦值如何在SQL中工作?

Declare @Var1 money, 
    @Var2 money, 
    @Var3 money, 

等等

Select @Var1 = OldValue, 
     @Var2 = @Var1, 

等等

所以我不知道這些任務是如何工作的,當他們都在同一個SELECT語句。我在調用select之後假設Var2 = OldValue,但我想確定。

圍繞這種情況的規則是什麼?這些作業是按照聲明的順序執行的嗎?如果是這樣,在下列情況下將賦予Var2什麼值:

Select @Var2 = @Var1, 
     @Var1 = OldValue, 

謝謝!

+1

目前,正在以某種簡單的存儲過程使用似乎在工作。所以我想我很確定它是按照預期運作的。無論哪種方式,我認爲它只是不好的風格。 – Brett 2011-04-22 17:23:11

回答

9
DECLARE @Var1 MONEY = 100, @Var2 MONEY = 50 

SELECT @Var1 = @Var2, 
     @Var2 = @Var1 

SELECT @Var1, @Var2 

返回

--------------------- --------------------- 
50.00     50.00 

所以在他們在從左到右的順序這可不能依靠執行的情況下!

如果有多個任務在一個單一的SELECT語句 條款, SQL Server不保證 順序 表現的評價。請注意,如果在作業中有引用 ,則效果爲 。

來源http://msdn.microsoft.com/en-us/library/ms187953.aspx

+1

感謝您的好回答,並且鏈接到文檔確實令人敬畏。 – Brett 2011-04-22 17:35:04

1

在@ var2 = @ var1的情況下,我相信var2是NULL .-它們將是值類型,所以在背景中沒有任何引用會像在.NET這樣的語言中進行。

你可以隨時通過提取sql代碼來測試,把結果放到表變量中,然後從中選擇,看看你有什麼。

1

你爲什麼不只是這樣做,如果你想@ VAL2具有相同的價值@ VAL1

​​
+0

你會這麼做。它的代碼不好,我正在完全替換它。 – Brett 2011-04-22 17:33:54

+0

從問題中指定的僞代碼,不清楚「OldValue」的含義。如果「OldValue」是一些不確定的表達,那麼HLGEM的建議可能不會爲這兩個變量分配相同的值。 – sqlvogel 2011-04-27 08:40:47