SQL TRIGGER处理多个INSERTED行

时间:2014-02-05 22:08:33

标签: sql-server tsql

我有UPDATE,如下所示:

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伪表的事实返回错误(“子查询返回的值超过1。当子查询跟随=,!=,&lt;,&lt时,不允许这样做; =,&gt;,&gt; =或当子查询用作表达式时。“)。我无法将类似问题的答案传达给我的案例。

  2. 如何让触发器用于 n BLOC列数(BLOC1,BLOC2,BLOC3,BLOCn ...)

1 个答案:

答案 0 :(得分: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;