2016-11-29 12 views
1

私は複数の更新/挿入を処理するTSQLトリガを作成する方法を研究しています。SQLトリガ複数挿入更新

複数のソースからのデータがありますが、私の目標は更新/挿入する前にそのデータを確認/修正することです。

私は、データの1行に作用するトリガを書きました。

私は、複数のデータ行を処理する方法を理解するのに苦労しています。

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 

トリガーは、行ごとではなくセット基づい動作として一度だけ実行NOTされるように全体DML操作のためだけONCEを実行します。そのため、他の更新日と同じようにjoinステートメントで扱う必要があります。特別なinsertedおよびdeletedテーブルを使用することができます。上記は更新トリガーの例であり、あなたに何らかの方向性を与えるはずです。

+0

ありがとうございます、今すぐチェックしましょう! –

+0

私は、事件陳述書のようなものがあることは知らなかった。これは超です! –

+0

@ E.Powell 'CASE' _expression_は値をもたらします。 'CASE' _文はありません。悲しいことに、マイクロソフトはそれを理解せず、用語を「ドキュメント」でランダムに使用しています。 – HABO

関連する問題