【问题标题】:SQL Update Trigger with If Else logic with Multiple Rows带有多行的 If Else 逻辑的 SQL 更新触发器
【发布时间】:2014-06-26 20:25:45
【问题描述】:

我无法让触发器处理多条记录,同时还包含我需要在插入记录之前进行测试的 if/else 逻辑。

我的目标是让系统的前端用户能够在值 1、2 和 3 之间更改事件类型,但如果他们将其更改为事件类型 1,那么他们必须输入发生日期,否则交易将被回滚。如果他们确实输入了发生日期,则将输入交易。以下逻辑适用于通过前端更新的任何 1 条记录,但问题是当通过 SQL 写入多个更改时,我收到错误:

“消息 512,级别 16,状态 1,过程 TG_tbl_LE_Event_Occurence_Date_Validation,第 9 行子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或当子查询用作表达式。 该语句已终止。 "

我知道触发器可以重写以考虑多条记录,但我找不到在 If Else 测试仍然起作用的地方编写它的方法。任何意见表示赞赏。

ALTER TRIGGER [dbo].[TG_tbl_LE_Event_Occurence_Date_Validation]
    ON [dbo].[tbl_LE_Event]
    AFTER update
AS
DECLARE @InsertID int
SET @InsertID = (Select Event_ID from Inserted)

IF (
    SELECT COUNT(*)
FROM inserted
WHERE inserted.Occurence_Date is null and inserted.Event_Type_ID = 1) > 0
BEGIN 
    ROLLBACK TRAN
    RAISERROR('#####OCCURENCE DATE IS A REQUIRED FIELD FOR TYPE 1 EVENTS. PLEASE ENTER AN OCCURENCE DATE OR THIS CHANGE WILL NOT BE SAVED#####',10,1)
END ELSE 
    UPDATE dbo.tbl_LE_Event
    SET dbo.tbl_LE_Event.Event_Type_ID = Inserted.event_type_ID,
        dbo.tbl_LE_Event.Occurence_Date = Inserted.Occurence_Date
    FROM inserted  
    JOIN dbo.tbl_LE_Event ON dbo.tbl_LE_Event.Event_ID = @InsertID

【问题讨论】:

  • 我似乎无法重现您的错误。这个 SQLFiddle (sqlfiddle.com/#!3/1b381/2) 似乎没有进行 COUNT(*) 测试,并在 event_type_id = 1 的地方添加了空日期。希望我能提供更多帮助 - 会一直摸不着头脑。
  • 您好,感谢您的关注。此处的 if 语句尝试查看用户是否尝试将事件类型更改为 1 但未能输入发生日期。如果是这种情况,则回滚事务并引发错误。否则,继续更新记录。

标签: sql-server if-statement triggers multiple-records


【解决方案1】:

我能够解决多条记录发生的错误。似乎代码不喜欢为 ID 使用变量,我将以下修订包括在内:

CREATE TRIGGER [dbo].[TG_tbl_LE_Event_Occurence_Date_Validation]
  ON [dbo].[tbl_LE_Event]
  AFTER update
  AS
     IF (SELECT count (*)FROM inserted
         WHERE inserted.Occurence_Date is null and inserted.Event_Type_ID = 1) >0
               BEGIN 
                rollback tran
                raiserror('#####OCCURENCE DATE IS A REQUIRED FIELD FOR LOSS EVENTS. PLEASE ENTER AN OCCURENCE DATE OR THIS CHANGE WILL NOT BE SAVED#####',10,1)
               END
     ELSE update dbo.tbl_LE_Event
        SET dbo.tbl_LE_Event.Event_Type_ID = Inserted.event_type_ID,
        dbo.tbl_LE_Event.Occurence_Date = Inserted.Occurence_Date
        from inserted join dbo.tbl_LE_Event on dbo.tbl_LE_Event.Event_ID = inserted.Event_ID


GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2023-03-31
    • 2016-03-24
    • 1970-01-01
    • 2012-12-11
    • 2011-03-24
    • 2012-02-13
    相关资源
    最近更新 更多