2014-02-05 90 views
0

我有一個UPDATE看起來像這樣:SQL TRIGGER處理多個插入的行

UPDATE STOR SET 
    STOR.BLOC1 = T.BLOC1, 
    STOR.BLOC2 = T.BLOC2, 
    STOR.BLOC3 = T.BLOC3 
FROM BLDG B INNER JOIN STOR S 
ON S.B_ID = B.B_ID 
CROSS APPLY dbo.INVENTORIZE(B.B_ID) AS T; 

而且其目的是要插入行(如日誌),每次更新上方TRIGGER

CREATE TRIGGER trgrCYCLE 
ON STOR 
FOR UPDATE 
AS 
DECLARE @BLDG int, @ACT varchar(4), @QTY decimal(3,1); 

SET @BLDG = (SELECT B_ID FROM inserted) 
SET @QTY= (SELECT BLOC1 FROM inserted) 
SET @ACT = CASE WHEN @QTY < 0 THEN 'SELL' 
      ELSE 'BUY' END 

INSERT INTO INVT VALUES (CURRENT_TIMESTAMP, @BLDG, @ACT, @QTY) 

我有我需要的援助兩個問題:

  1. 具有多行inserted僞表返回錯誤的事實(「子查詢返回多個值,這不當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時允許。「)。我無法將類似問題的答案傳達給我的案例。

  2. 如何對ň數BLOC列觸發工作(BLOC1,BLOC2,BLOC3,BLOCn ...)

+0

您需要更好地定義2.「爲n個BLOC列工作」是什麼意思?目標表中是否有多列?您是否試圖在BLOC列中插入新行?現在這個要求非常寬鬆 - 很有道理。 –

回答

3

對於第一個問題,你不能使用變量來存儲來自多行的值。插入一組。

INSERT dbo.INVT -- schema prefix! 
    (column_list!!!) 
    SELECT CURRENT_TIMESTAMP, B_ID, 
    CASE WHEN BLOC1 < 0 THEN 'SELL' ELSE 'BUY' END, BLOC1 
    FROM inserted; 

對於第二個問題,最簡單的方法可能是每個BLOCn的INSERT語句。

INSERT dbo.INVT -- schema prefix! 
    (column_list!!!) 
    SELECT CURRENT_TIMESTAMP, B_ID, 
    CASE WHEN BLOC2 < 0 THEN 'SELL' ELSE 'BUY' END, BLOC2 
    FROM inserted; 

INSERT dbo.INVT -- schema prefix! 
    (column_list!!!) 
    SELECT CURRENT_TIMESTAMP, B_ID, 
    CASE WHEN BLOC3 < 0 THEN 'SELL' ELSE 'BUY' END, BLOC3 
    FROM inserted; 
+0

+1。 。 。打敗了我。 –

+0

@GordonLinoff:亞倫的手指真的很快:-) –

+0

Thx! 「UPDATE」有幾個「BLOC」列,「INVT」需要爲每個列保存一條記錄。每插入一個BLOC插入 – greener