SQL Server Management Studio-更新后更新案例

SQL Server Management Studio-更新后更新案例,sql,sql-server-2012,case,Sql,Sql Server 2012,Case,我正在使用SQL Server Management Studio并尝试创建一个触发器,该触发器将在“订单”表更新后将“礼物id”列的值设置为“NULL”,其中同一行“保留id”列的值将为“0CREATE trigger add\u reservation” 关于[dbo].[order] 更新后 作为 开始 不计数; 更新O 设置O.[gift_id]=NULL 从[dbo].[order]O o.Pk_列上插入的内部联接i=i.Pk_列--0 或i.[reservation\u id]不为空

我正在使用SQL Server Management Studio并尝试创建一个触发器,该触发器将在“订单”表更新后将“礼物id”列的值设置为“NULL”,其中同一行“保留id”列的值将为“0
CREATE trigger add\u reservation”
关于[dbo].[order]
更新后
作为
开始
不计数;
更新O
设置O.[gift_id]=NULL
从[dbo].[order]O
o.Pk_列上插入的内部联接i=i.Pk_列--0
或i.[reservation\u id]不为空
结束
去

我自己从中找到了另一个解决方案 ”“邮局

它实现了我想要的功能,但每行都会更新,因此需要大量的资源和时间。也许它更简单,但不是最好的解决方案

CREATE TRIGGER [dbo].[add_reservation]
ON  [dbo].[order]
AFTER UPDATE
AS BEGIN
UPDATE [dbo].[order]
SET [gift_id] =
( CASE 
WHEN ([reservation_id] IS NOT NULL) THEN NULL
ELSE [gift_id]
END )
END
对于一个在某个时候试图做同样事情的人,我遇到了一些问题

案例规范中至少有一个结果表达式必须为 非空常量的表达式

要解决这个问题,只需添加

 ELSE [gift_id]

T-SQL中的
CASE
是一个表达式(如
a+b
),它只能返回一个原子值-它不是用来控制程序流或类似的东西…“像个魔咒一样工作“-但也会在每次更新期间更新表中的每一行。我郑重地建议您使用或至少检查一下它,并试着理解它的真正含义,谢谢!效果更好!
CREATE TRIGGER [dbo].[add_reservation]
ON  [dbo].[order]
AFTER UPDATE
AS BEGIN
UPDATE [dbo].[order]
SET [gift_id] =
( CASE 
WHEN ([reservation_id] IS NOT NULL) THEN NULL
ELSE [gift_id]
END )
END
 ELSE [gift_id]