【问题标题】:This trigger works for one row, how to make it work on multiple rows?此触发器适用于一行,如何使其适用于多行?
【发布时间】:2013-10-13 10:45:48
【问题描述】:
/* This trigger works for one row, how to make it work on multiple rows ?*/

CREATE TRIGGER SendMail ON contract
AFTER INSERT, UPDATE, DELETE 
AS

SET NOCOUNT ON
IF ( UPDATE(Contract_Status))
Begin

/* This comparison works for one row, how to make it work on multiple rows ?*/

IF ((SELECT Contract_Status FROM INSERTED) <> (select Contract_Status FROM DELETED))
Begin 


DECLARE @body NVARCHAR(MAX) = N'';
SELECT @body += CHAR(13) + CHAR(10) + RTRIM(Contract_Ref_1) FROM inserted;


  EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'AdminProfile',
    @recipients = 'XXXXX@live.be',
    @body = @body,
    @subject = 'Status Update BELUX_OEM';

End
End

【问题讨论】:

  • “处理多行”是什么意思?
  • 当我尝试运行将更新合同表中的多行的存储过程时,我收到一个错误。当我只更新合同表中的一行时,它可以工作。
  • 解释比较应该做什么。特别是在插入或删除的情况下(更新很明显)。

标签: sql-server tsql triggers


【解决方案1】:

我会这样做:

CREATE TRIGGER SendMail ON contract
AFTER INSERT, UPDATE, DELETE 
AS

SET NOCOUNT ON
IF ( UPDATE(Contract_Status))
Begin

    IF EXISTS(SELECT *
              FROM   INSERTED i
              JOIN   DELETED d ON i.PrimaryKey = d.PrimaryKey
              WHERE  d.Contract_Status <> i.Contract_Status)
    Begin 


    DECLARE @body NVARCHAR(MAX) = N'';
    SELECT @body += CHAR(13) + CHAR(10) + RTRIM(Contract_Ref_1) 
    FROM inserted i
    WHERE NOT EXISTS(SELECT * FROM deleted d
                     WHERE  i.PrimaryKey = d.PrimaryKey
                       AND  i.Constract_Status <> d.Contract_Status)

      EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'AdminProfile',
        @recipients = 'XXXXX@live.be',
        @body = @body,
        @subject = 'Status Update BELUX_OEM';

    End
End

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2015-10-12
    相关资源
    最近更新 更多