【发布时间】: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