2016-11-29 4 views
1

Ich habe untersucht, wie man einen TSQL-Trigger, der mehrere Update/Inserts behandeln wird erstellen.SQL-Trigger mehrere einfügen Update

Wir haben Daten aus mehreren Quellen und mein Ziel ist es, diese Daten vor dem Aktualisieren/Einfügen zu überprüfen/zu korrigieren.

Ich schrieb einen Auslöser, der für einzelne Datenzeilen funktioniert.

Ich kämpfe um herauszufinden, wie es mehrere Datenzeilen zu behandeln.

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 

Ich denke, was wirft ich bin, wo die Felder zu verbinden, damit ich die Daten gegen Daten in einer anderen Tabelle überprüfen.

Ich habe noch nie zuvor einen Trigger geschrieben, also würde jede Hilfe geschätzt werden.

Antwort

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 

Trigger sind NICHT einmal ausgeführt pro Reihe, sondern als Satz basiert Betrieb so nur EINMAL für die gesamte DML-Operation ausgeführt. Sie müssen es also wie jedes andere Aktualisierungsdatum mit der Join-Anweisung behandeln. Nur Sie können die speziellen Tabellen inserted und deleted verwenden. Das obige Beispiel zeigt einen Aktualisierungstrigger und sollte Ihnen eine Richtung geben.

+0

Danke, ich überprüfe es jetzt! –

+0

Ich hatte keine Ahnung, dass es so etwas wie eine Fallaussage gab. Das ist super! –

+0

@ E.Powell Ein 'CASE' _Ausdruck_ ergibt einen Wert. Es gibt keine CASE-Anweisung. Leider versteht Microsoft das nicht und verwendet die Terminologie willkürlich in ihrer "Dokumentation". – HABO