2015-06-02 53 views
0

我爲什麼看到兩個語句之間的區別有點困惑。我試圖簡單地遞增1的INT列,所以設置值1,2,3,4,等:包含多個集合的更新語句

QUERY#1產生所期望的結果:

DECLARE @a int 
SET @a = 0 
UPDATE #jc_TEMP 
SET num = @a, @[email protected]+1 

QUERY#2將所有行設置爲0:

DECLARE @a int 
SET @a = 0 
UPDATE #jc_TEMP 
SET num = @a 
SET @[email protected]+1 

顯然我在這裏錯過了一些東西,但對肉眼來說它們看起來是相同的。第二個查詢中的局部變量回滾是否存在?

+0

任何特定的數據庫? – GolezTrol

+0

你的第二個查詢沒有'WHERE'子句,所以它會將每條記錄設置爲0.第一個查詢在更新時也會增加'@ a'變量。 – Siyual

+0

@Siyual - 有沒有其他方法可以在不使用遊標的情況下重寫第一個查詢?另外,爲什麼缺少where子句對查詢#1沒有問題?謝謝! – tchock

回答

3

由於第二 「UPDATE」 實際上是兩個分開的語句

1 - DECLARE @a int 
2 - SET @a = 0 
3 - UPDATE #jc_TEMP 
     SET num = @a 

4 - SET @[email protected]+1 

UPDATE集所有行的@a的值(其爲0),則語句增量@a

你的第一個UPDATE

1 - DECLARE @a int 
2 - SET @a = 0 
3 - UPDATE #jc_TEMP 
     SET num = @a, 
      @[email protected]+1 

增量@a值的每一行,所以你看在數據的增量。

+0

這是困擾我的事情,但爲什麼第一行得到更新到1而不是0在這裏? SET順序不是從左到右?我會假設第一行用@a值更新爲0,然後將該變量更新爲+1,並將下一行更新爲1. – tchock

+0

我也是,但這可能是一個實現細節 - 什麼類型的你正在使用數據庫嗎? SQL Server? MySQL的?甲骨文? –

+0

我正在使用SQL Server。 – tchock