2017-05-26 10 views
0

挿入または更新が実行されるたびにテーブルBにアップサートするトリガーをテーブルAに追加しようとしています。私はこれを達成するためにMERGEを使用しています。テーブルAのトリガーがテーブルBへのマージ(Upsert)

このデータベースはSQL Server 2008 R2で実行されています。ここで

は私のスクリプトです:私はこのトリガーを適用しようとすると

USE [XMPie] 
GO 

/****** Object: Trigger [dbo].[tr_targetupd40836-09] Script Date: 5/25/2017 10:18:30 AM ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 


CREATE TRIGGER [dbo].[tr_targetupd40872-01a] 
ON [dbo].[40872-01] 
after update, insert as 

DECLARE @CJ int, @BPID int, @Email varchar(100) 

IF (SELECT TOP 1 OptOut FROM inserted) = 1 
BEGIN 
    SELECT top 1 @CJ = CAST([MicrositeNumber] AS int) FROM inserted 

    SELECT TOP 1 @BPID = bp.BPID 
      FROM JandLreporting.dbo.ControlJob cj 
      INNER JOIN JandLreporting.dbo.BusinessPartner bp 
      ON cj.JLMReferenceID = bp.JLMReferenceID 
      WHERE cj.ControlJob = @CJ 

    SELECT top 1 @Email = RTRIM(LTRIM(Email)) FROM inserted 

    IF @BPID IS NOT NULL AND NOT EXISTS (SELECT * FROM [DoNotContactEmail] where Email = @Email and BPID = @BPID) 
    INSERT [DoNotContactEmail](email, bpid) VALUES(@Email, @BPID) 
END 
ELSE 
BEGIN 
    MERGE JandLreporting.dbo.MicrositeResponseAdor AS T   
    USING inserted AS S  
    ON T.RecipientKey = S.RecipientKey 
    WHEN MATCHED THEN 
   UPDATE set T.[MicrositeResponse_ID]= (s.[MicrositeResponse_ID]) 
     ,T.[MicrositeNumber]=LEFT(s.[MicrositeNumber],50) 
     ,T.[RecipientKey]=LEFT(s.[RecipientKey],101) 
     ,T.[Vin]=LEFT(s.[Vin],30) 
     ,T.[FirstName]=LEFT(s.[FirstName],50) 
     ,T.[MiddleInitial]=LEFT(s.[MiddleInitial],1) 
     ,T.[LastName]=LEFT(s.[LastName],50) 
     ,T.[FullName]=LEFT(s.[FullName],100) 
     ,T.[Address1]=LEFT(s.[Address1],100) 
     ,T.[Address2]=LEFT(s.[Address2],50) 
     ,T.[City]=LEFT(s.[City],50) 
     ,T.[State]=LEFT(s.[State],2) 
     ,T.[ZipCode]=LEFT(s.[ZipCode],10) 
     ,T.[PhoneNumber]=LEFT(s.[PhoneNumber],15) 
    WHEN NOT MATCHED THEN   
   INSERT (T.[ID] 
     ,T.[MicrositeResponse_ID] 
     ,T.[MicrositeNumber] 
     ,T.[RecipientKey] 
     ,T.[Vin] 
     ,T.[FirstName] 
     ,T.[MiddleInitial] 
     ,T.[LastName] 
     ,T.[FullName] 
     ,T.[Address1] 
     ,T.[Address2] 
     ,T.[City] 
     ,T.[State] 
     ,T.[ZipCode] 
     ,T.[PhoneNumber] 
     ) 
     VALUES (s.[ID] 
     ,s.[MicrositeResponse_ID] 
     ,s.[MicrositeNumber] 
     ,s.[RecipientKey] 
     ,s.[Vin] 
     ,s.[FirstName] 
     ,s.[MiddleInitial] 
     ,s.[LastName] 
     ,s.[FullName] 
     ,s.[Address1] 
     ,s.[Address2] 
     ,s.[City] 
     ,s.[State] 
     ,s.[ZipCode] 
     ,s.[PhoneNumber]) 
END 

GO 

、私は次のエラーを取得する:構文エラーがある場合

Msg 102, Level 15, State 1, Procedure tr_targetupd40872-01a, Line 26 [Batch Start Line 9] 
Incorrect syntax near ' '. 

は私が把握することはできません。どんな助けもありがとう!

+0

'BEGIN' /' END'でコードをラップし、それが問題を修正するかどうかを確認します。 –

+0

どこから始めるべきですか?トリガーを作成する前に? – jkruer01

+0

'beginとしてbeginとendを挿入します。 – artm

答えて

0

次のように、BEGIN/ENDでトリガのコードをラップする必要があります。

CREATE TRIGGER [dbo].[tr_targetupd40872-01a] 
ON [dbo].[40872-01] 
after update, insert as 
BEGIN --begin trigger 
    DECLARE @CJ int, @BPID int, @Email varchar(100) 

    IF (SELECT TOP 1 OptOut FROM inserted) = 1 
    BEGIN 
    SELECT top 1 @CJ = CAST([MicrositeNumber] AS int) FROM inserted 

    SELECT TOP 1 @BPID = bp.BPID 
     FROM JandLreporting.dbo.ControlJob cj 
     INNER JOIN JandLreporting.dbo.BusinessPartner bp 
      ON cj.JLMReferenceID = bp.JLMReferenceID 
     WHERE cj.ControlJob = @CJ 

    SELECT top 1 @Email = RTRIM(LTRIM(Email)) FROM inserted 

    IF @BPID IS NOT NULL AND NOT EXISTS (SELECT * FROM [DoNotContactEmail] where Email = @Email and BPID = @BPID) 
    INSERT [DoNotContactEmail](email, bpid) VALUES(@Email, @BPID) 
    END 
    ELSE 
    BEGIN 
    MERGE JandLreporting.dbo.MicrositeResponseAdor AS T 
     USING inserted AS S 
     ON T.RecipientKey = S.RecipientKey 
     WHEN MATCHED THEN UPDATE 
     set T.[MicrositeResponse_ID]= (s.[MicrositeResponse_ID]) 
      ,T.[MicrositeNumber]=LEFT(s.[MicrositeNumber],50) 
      ,T.[RecipientKey]=LEFT(s.[RecipientKey],101) 
      ,T.[Vin]=LEFT(s.[Vin],30) 
      ,T.[FirstName]=LEFT(s.[FirstName],50) 
      ,T.[MiddleInitial]=LEFT(s.[MiddleInitial],1) 
      ,T.[LastName]=LEFT(s.[LastName],50) 
      ,T.[FullName]=LEFT(s.[FullName],100) 
      ,T.[Address1]=LEFT(s.[Address1],100) 
      ,T.[Address2]=LEFT(s.[Address2],50) 
      ,T.[City]=LEFT(s.[City],50) 
      ,T.[State]=LEFT(s.[State],2) 
      ,T.[ZipCode]=LEFT(s.[ZipCode],10) 
      ,T.[PhoneNumber]=LEFT(s.[PhoneNumber],15) 
     WHEN NOT MATCHED THEN INSERT (
      T.[ID] 
      ,T.[MicrositeResponse_ID] 
      ,T.[MicrositeNumber] 
      ,T.[RecipientKey] 
      ,T.[Vin] 
      ,T.[FirstName] 
      ,T.[MiddleInitial] 
      ,T.[LastName] 
      ,T.[FullName] 
      ,T.[Address1] 
      ,T.[Address2] 
      ,T.[City] 
      ,T.[State] 
      ,T.[ZipCode] 
      ,T.[PhoneNumber] 
     ) VALUES (
      s.[ID] 
      ,s.[MicrositeResponse_ID] 
      ,s.[MicrositeNumber] 
      ,s.[RecipientKey] 
      ,s.[Vin] 
      ,s.[FirstName] 
      ,s.[MiddleInitial] 
      ,s.[LastName] 
      ,s.[FullName] 
      ,s.[Address1] 
      ,s.[Address2] 
      ,s.[City] 
      ,s.[State] 
      ,s.[ZipCode] 
      ,s.[PhoneNumber] 
     ) 
    END 
END -- End of trigger 
GO 
関連する問題