SQL插入触发器以更新INSERTED表值

Shi*_*mmy 27 triggers sql-server-2005 insert

我想创建一个Insert触发器,如果​​它们为null,则更新所有插入行的值,根据inserted表中的另一列,新值应从不同的表中获取.

我试过了:

UPDATE INSERTED
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1
    )
WHERE ValueCol IS NULL
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

Msg 286, Level 16, State 1, Procedure ThisTable_INSERT, Line 15
The logical tables INSERTED and DELETED cannot be updated.
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

Mic*_*ren 45

您需要更新目标表,而不是逻辑表.但是,您可以使用逻辑表连接以确定要更新的行:

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
Run Code Online (Sandbox Code Playgroud)


小智 20

您可以将触发器更改为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
Run Code Online (Sandbox Code Playgroud)

注意:INSTEAD OF触发器不会导致递归.