我有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)
我有两个问题需要帮助:
具有多行的inserted
伪表的事实返回错误(“子查询返回的值超过1。当子查询跟随=,!=,&lt;,&lt时,不允许这样做; =,&gt;,&gt; =或当子查询用作表达式时。“)。我无法将类似问题的答案传达给我的案例。
如何让触发器用于 n BLOC列数(BLOC1,BLOC2,BLOC3,BLOCn ...)
答案 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;