sql-server - 合并语句和触发器 SQL Server 2012

标签 sql-server t-sql merge triggers

我有一个合并语句应该多次执行触发器。

我首先以为我的触发器没有执行,但经过一些研究,我发现每个语句仅触发一次触发器(一个触发器就是一个语句)。

但是所有的帖子都是旧的,我认为现在可能有一种简单的方法可以让我的触发器多次执行。

那么我可以在触发器或合并语句中添加任何内容以使触发器执行此操作吗?

谢谢

触发

TRIGGER [dbo].[Sofi_TERA_Trigger]
   ON [dbo].[ZZ]
   AFTER INSERT,UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    IF EXISTS(SELECT 1 FROM inserted WHERE inserted.Statut LIKE '%CLOT%' OR inserted.Statut LIKE '%CLTT%' OR inserted.Statut LIKE '%CONF%')
        BEGIN
            DECLARE @Id int;
            DECLARE @Matricule varchar(10);
            DECLARE @IdAction int;
            DECLARE @NumeroOF int; 
            SELECT @NumeroOF = inserted.Ordre from inserted;

            DECLARE OF_CURSOR CURSOR
                LOCAL STATIC READ_ONLY FORWARD_ONLY
            FOR
            SELECT Id,Log.Matricule,IdAction from Log inner join (select max(Id) as maxID,Matricule from LOG where Log.NumeroOF = @NumeroOF group by Matricule) maxID 
            on maxID.maxID = Log.Id where Log.NumeroOF = @NumeroOF;

            OPEN OF_CURSOR
            FETCH NEXT FROM OF_CURSOR INTO @Id,@Matricule,@IdAction
            WHILE @@FETCH_STATUS = 0
            BEGIN
                IF @IdAction!=13
                    BEGIN
                        IF @IdAction<=2
                        BEGIN
                            insert into Log(NumeroOF,Matricule,IdAction,Date,EstAdmin) values (@NumeroOF,@Matricule,13,GETDATE(),1);
                        END
                        ELSE
                        BEGIN
                            insert into Log(NumeroOF,Matricule,IdAction,Date,EstAdmin) values (@NumeroOF,@Matricule,2,GETDATE(),1);
                            insert into Log(NumeroOF,Matricule,IdAction,Date,EstAdmin) values (@NumeroOF,@Matricule,13,GETDATE(),1);
                        END
                    END              
                FETCH NEXT FROM OF_CURSOR INTO @Id,@Matricule,@IdAction
            END

            CLOSE OF_CURSOR;
            DEALLOCATE OF_CURSOR;
    END 
END

合并语句

Merge ZZ AS TARGET USING ZZTemp AS SOURCE 
ON (Target.Operation=Source.Operation AND Target.Ordre=Source.Ordre) 
WHEN MATCHED THEN 
UPDATE SET TARGET.DateTERA=SOURCE.DateTERA, TARGET.MatTERA=SOURCE.MatTERA, TARGET.MatTERC=SOURCE.MatTERC 
WHEN NOT MATCHED THEN                       
INSERT(Operation,Ordre,ElementOTP,Article,DesignationOF,PosteTravail,ValeurTemps,DHT,Statut,StatutOF,TexteActivite,DateTERA,MatTERA,MatTERC,StatutMat)                                  
VALUES(SOURCE.Operation,SOURCE.Ordre,SOURCE.ElementOTP,SOURCE.Article,SOURCE.DesignationOF,SOURCE.PosteTravail,SOURCE.ValeurTemps,SOURCE.DHT,
SOURCE.Statut,SOURCE.StatutOF,SOURCE.TexteActivite,SOURCE.DateTERA,SOURCE.MatTERA,SOURCE.MatTERC,SOURCE.StatutMat);

最佳答案

您的问题是游标被错误地写入来处理数据集。任何将值形式插入或删除到标量变量的触发器都是不正确的,出于数据完整性的原因必须重写。这个触发器有问题。时期。无可避免的是,它必须被重写(以及使用相同技术的任何其他内容)。

触发器内的代码应该类似于:

INSERT INTO Log(NumeroOF,Matricule,IdAction,Date,EstAdmin)
SELECT max(Id),l.Matricule,l.IdAction, 13,GETDATE(),1 
FROM Log l
JOIN Inserted i ON l.NumeroOF = i.Ordre
WHERE i.Statut LIKE '%CLOT%' OR i.Statut LIKE '%CLTT%' OR i.Statut LIKE '%CONF%'
GROUP BY l.Matricule,l.IdAction

INSERT INTO Log(NumeroOF,Matricule,IdAction,Date,EstAdmin)
SELECT max(Id),l.Matricule,l.IdAction, 2,GETDATE(),1 
FROM Log l
JOIN Inserted i ON l.NumeroOF = i.Ordre
WHERE IdAction<=2
WHERE i.Statut LIKE '%CLOT%' OR i.Statut LIKE '%CLTT%' OR i.Statut LIKE '%CONF%'
GROUP BY l.Matricule,l.IdAction  

确保使用单记录和多记录插入进行测试,因为应测试所有触发器。一旦您确信触发器正确,就尝试合并。

关于sql-server - 合并语句和触发器 SQL Server 2012,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45619893/

相关文章:

SQL IF 语句使用多个 ISNULL

sql-server - SQL Server 2008合并语句检查并插入记录是否不存在

sql - 获取sql中的查询计数

t-sql - 将 varchar(max) 转换为十进制时,将数据类型 varchar 转换为数字时出错

sql - 转换失败 (SQL Server 2008)

Git merge 2 个版本没有共同的祖先

video - 有没有人使用 ffmpeg 连接两个视频

java - SQL Server 2016 : Enable TLS 1. 2 用于 SQL Server 连接

sql-server - Azure SQL 服务器集允许在 ARM 模板或 PowerShell 中访问 Azure 服务

sql-server - 将数据插入 SQL Server 中的表时出错