2016-11-29 113 views
1

我一直在研究如何创建一个TSQL触发器来处理多个更新/插入。SQL触发多个插入更新

我们有来自多个来源的数据,我的目标是在更新/插入之前验证/更正数据。

我写了一个触发器,适用于单行数据。

我正在努力弄清楚如何让它来处理多行数据。

CREATE TRIGGER [dbo].[tr_GPTitleToGov] 
ON [dbo].[GoverningPersons] 
AFTER INSERT, UPDATE 
AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @Title1 VARCHAR(15) 
DECLARE @UBI VARCHAR(9) 
DECLARE @ETPID CHAR(4) 
DECLARE @Ident INT 

SET @Title1 = (SELECT Title1 FROM INSERTED) 
SET @UBI = (SELECT UBI FROM INSERTED) 
SET @ETPID = (SELECT [ETPID] FROM [entity] WHERE @UBI = [entity].[UBI]) 
SET @Ident = (SELECT Ident FROM INSERTED) 

IF ((@Title1 = 'Executor') OR (@Title1 = 'Incorporator')) 
    BEGIN 
     IF @ETPID IN ('0143', '0147', '0148', '0150', '0152', '0154') 
     UPDATE GoverningPersons 
     SET [Title1] = 'Executor', 
      [Title2] = NULL, 
      [Title3] = NULL, 
      [Title4] = NULL 
     WHERE Ident = @Ident; 

     ELSE 
     UPDATE GoverningPersons 
     SET [Title1] = 'Incorporator', 
      [Title2] = NULL, 
      [Title3] = NULL, 
      [Title4] = NULL 
     WHERE Ident = @Ident; 
    END 
ELSE 
    UPDATE GoverningPersons 
    SET [Title1] = 'Governor', 
     [Title2] = NULL, 
     [Title3] = NULL, 
     [Title4] = NULL 
    WHERE Ident = @Ident; 
END 

我想扔什么是我在哪里加入字段,所以我可以检查数据在不同的表中的数据。

我从来没有写过触发器,所以任何帮助,将不胜感激。

回答

3
CREATE TRIGGER [dbo].[tr_GPTitleToGov] 
ON [dbo].[GoverningPersons] 
AFTER UPDATE 
AS 
BEGIN 
SET NOCOUNT ON; 

UPDATE gp 
    SET Title1 = CASE 
      WHEN i.Title1 IN ('Incorporator','Executor') 
       AND e.ETPID IN ('0143', '0147', '0148', '0150', '0152', '0154') THEN 'Executor' 
      WHEN i.Title1 IN ('Incorporator','Executor') THEN 'Incorporator' 
      ELSE 'Governor' 
      END 
     ,Title2 = NULL 
     ,Title3 = NULL 
     ,Title4 = NULL 
FROM 
    GoverningPersons gp 
    INNER JOIN inserted i 
    ON gp.Ident = i.Ident 
    LEFT JOIN entity e 
    ON i.UBI = e.UBI 


END 

触发器是每排一次,而是使执行只有一次整个DML操作的一套基于操作执行。因此,您需要像加入语句一样将其视为任何其他更新日期。只有您可以使用特殊的inserteddeleted表格。以上是更新触发器的示例,应该为您提供一些指导。

+0

谢谢,我现在检查一下! –

+0

我不知道有这样的事情作为案件陈述。这是超级! –

+0

@ E.Powell一个'CASE' _expression_结果是一个值。没有'CASE' _statement_。可悲的是,微软并不理解这一点,而是在其“文档”中随意使用术语。 – HABO