2014-03-06 84 views
2

等於運營商我猜不出真正的長期(多個相等運算符或其他),但樣品是在這裏:多(級聯)在TSQL

UPDATE Account 
SET @newOverall = Overall = Overall - @Amount 
FROM Account WHERE Id = @accountId 

@newOverall =總體=總體 - @Amount

是否方便TSQL(Microsoft SQL Server上)

編輯

這兩個答案似乎都是正確的。 (感謝弗拉基米爾和M.Ali)如果你的表格包含觸發器,並且你需要得到標量值,那麼弗拉基米爾的方式更好(更安全)。如果您的更新影響多個記錄,並且您需要獲取所有已更改的記錄,而不是M.Ali的方式是贏家。但我不得不選擇M.Ali的方式,因爲我認爲OUTPUT是爲這種情況而創建的,而且它是更通用的解決方案。感謝測試代碼弗拉基米爾。 (#1,我們需要多接受的答案!:))

+0

這個操作/成語的目的是什麼? –

+1

你是什麼意思「便於TSql」? – Jim

+0

該語法是可以接受的,但可能會引起混淆, – 2014-03-06 18:56:57

回答

2

KISS(保持簡單糖),您可以利用OUTPUT子句在UPDATE語句做這樣的事情....

DECLARE @TABLE TABLE(Overall INT) 

UPDATE Account 
SET Overall = Overall - @Amount 
OUTPUT inserted.Overall INTO @TABLE(Overall) 
WHERE Id = @accountId 

INSERT語句中將會像

INSERT INTO [Transaction] 
SELECT @date,@accountId,@Amount,Overall 
FROM @Table 
2

您指定語法是完全有效的,並會工作得很好,但是爲了避免混淆我將它修改了這一點。

UPDATE Account 
    SET Overall = Overall - @Amount 
     ,@newOverall = Overall - @Amount 
    FROM Account 
    WHERE Id = @accountId 

請注意,@newOverall變量只會反映上次分配的值。如果您更新了超過1行,這會導致您遇到問題。

這裏是一個測試,兩種方法都返回相同的結果。

DECLARE @newOverall INT 
    ,@Amount INT = 1; 

DECLARE @Account TABLE (Overall INT) 

INSERT INTO @Account 
    VALUES (10), 
      (15), 
      (13) 

UPDATE @Account 
    SET Overall = Overall - @Amount 
     ,@newOverall = Overall - @Amount 
    FROM @Account 

SELECT * 
    FROM @Account; 
SELECT @newOverall 

DELETE FROM @Account 

INSERT INTO @Account 
    VALUES (10), 
      (15), 
      (13); 

UPDATE @Account 
    SET @newOverall = Overall = Overall - @Amount 
    FROM @Account 

SELECT * 
    FROM @Account; 
SELECT @newOverall; 
+0

I'已經編輯了有詳細解釋的問題。寫測試代碼也讚賞態度。感謝弗拉基米爾。 – ozz