sql - 修改 SQL 触发器,使其在插入的表包含多行时起作用

标签 sql sql-server performance t-sql triggers

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

本质上,触发器检查“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

最佳答案

这应该是你的触发器:

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

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

关于sql - 修改 SQL 触发器,使其在插入的表包含多行时起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12825727/

相关文章:

mysql - 带子查询的 select 内的 where 子句

java - ERROR : java. sql.SQLSyntaxErrorException:您的 SQL 语法有错误;

mysql - 元素重复至少 3 次

sql - LEFT JOIN 匹配。如果没有匹配,需要在最近的日期匹配

c# - Entity Framework 4 - 事件连接数

javascript - 将所有元素的点击绑定(bind)替换为单个文档(('click')?

php - 获得最长的层次结构

sql-server - 如何从拥有架构的 sql server 2012 中删除用户

sql-server - 为什么SqlConnection.Open()可能会出现超时?

Java Collection 建议