2017-05-26 35 views
0

我试图向表A添加一个触发器,每当执行插入或更新操作时都会向表B中插入一个upsert。我正在使用MERGE来完成此操作。在表A上执行合并(Upsert)到表B

此数据库在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 as'和'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 
相关问题