web-dev-qa-db-ja.com

INSERTEDテーブル値を更新するSQL挿入トリガー

挿入されたテーブルの別の列に従って、挿入されたすべての行の値がnullの場合、新しい値は別のテーブルから取得される必要がある場合、値を更新する挿入トリガーを作成します。

私は試した:

UPDATE INSERTED
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1
    )
WHERE ValueCol IS NULL

しかし、私はこのエラーを受け取ります:

Msg 286, Level 16, State 1, Procedure ThisTable_INSERT, Line 15
The logical tables INSERTED and DELETED cannot be updated.

どうすればいいですか?

27
Shimmy

論理テーブルではなく、宛先テーブルを更新する必要があります。ただし、論理テーブルと結合して、更新する行を特定します。

UPDATE YourTable
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1
    )
FROM YourTable Y
JOIN Inserted I ON Y.Key = I.Key
WHERE I.ValueCol IS NULL
45
Michael Haren

トリガーをINSTEAD OF INSERTに変更できます。これにより、着信値を確認し、必要に応じて他のテーブルの値に置き換えることができます。

CREATE TRIGGER CoolTrigger 
ON MyAwesomeTable 
INSTEAD OF INSERT
AS 
BEGIN  

INSERT MyAwesomeTable (TheValueCol)
SELECT ISNULL(INSERTED.TheValueCol, AnotherTable.TheValueCol) AS TheValueCol
FROM INSERTED
JOIN AnotherTable ON INSERTED.ValueCol1 = AnotherTable.ValueCol1

END

注:INSTEAD OFトリガーは再帰を引き起こしません。

20
Jeff French
insert into output  
(SELECT t1.ts - INTERVAL (SECOND(t1.ts)%10) SECOND,  
t1.ts - INTERVAL (SECOND(t1.ts)%10) SECOND + INTERVAL 10 SECOND ,sum(t1.data),   
FROM (select * from input   
where unix_timestamp(ts) >= unix_timestamp('2000-01-01 00:00:10')  
and unix_timestamp(ts) < unix_timestamp('2000-01-01 00:01:20')  
)
  as t1   
GROUP BY UNIX_TIMESTAMP(t1.ts) DIV 10 );

これが私の出力テーブルの出所です。したがって、挿入は値によるものではありません。

申し訳ありませんが、ここ(オフィス)からアカウントにアクセスできません。

0
Rohan