当插入的表包含多行时,修改SQL触发器

Sco*_*ott 2 sql t-sql sql-server performance triggers

我在SQL Server 2008中为一个表编写了一个SQL触发器.当'inserted'表中只有一行时,它运行良好.当有多行时,如何修改此触发器才能正常工作?性能是关键所在,所以我想远离游标,临时表等(如果可能的话).

本质上,触发器会检查"ClientID"或"TemplateID"字段是否已更改.如果它们是,并且OriginalClientID或OriginalTemplateID字段为空,则填充它们(因此只设置一次OriginalXXX字段,因此我总能看到第一个值是什么).

CREATE TRIGGER [dbo].[trigSetOriginalValues]
   ON  [dbo].[Review]
   FOR INSERT, UPDATE
AS 
BEGIN
    IF (NOT UPDATE(TemplateID) AND NOT UPDATE(ClientID)) return

    DECLARE @TemplateID int
    DECLARE @OriginalTemplateID int
    DECLARE @ClientID int
    DECLARE @OriginalClientID int   
    DECLARE @ReviewID int

    SET @ReviewID = (SELECT ReviewID FROM inserted)
    SET @ClientID = (SELECT ClientID FROM inserted)
    SET @TemplateID = (SELECT TemplateID FROM inserted)
    SET @OriginalTemplateID = (SELECT OriginalTemplateID FROM inserted);
    SET @OriginalClientID = (SELECT OriginalClientID FROM inserted);

    IF (@OriginalTemplateID IS NULL AND @TemplateID IS NOT NULL) 
    BEGIN
        UPDATE [dbo].[Review] SET OriginalTemplateID = @TemplateID WHERE ReviewID=@ReviewID
    END

    IF (@OriginalClientID IS NULL AND @ClientID IS NOT NULL) 
    BEGIN
        UPDATE [dbo].[Review] SET OriginalClientID = @ClientID WHERE ReviewID=@ReviewID
    END 
END
Run Code Online (Sandbox Code Playgroud)

Lam*_*mak 5

这应该是你的触发器:

UPDATE A
SET A.OriginalTemplateID = B.TemplateID
FROM [dbo].[Review] A
INNER JOIN INSERTED B
    ON A.ReviewID = B.ReviewID
WHERE A.OriginalTemplateID IS NULL AND B.TemplateID IS NOT NULL

UPDATE A
SET A.OriginalClientID = B.ClientID 
FROM [dbo].[Review] A
INNER JOIN INSERTED B
    ON A.ReviewID = B.ReviewID
WHERE A.OriginalClientID IS NULL AND B.ClientID IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

虽然您仍然可以在单个上执行此操作UPDATE,但使用更复杂的过滤器.