2015-12-07 43 views
1

我正在使用SQL Server Management Studio,并尝试将“订单”表更新后的触发器设置为“gift_id”列值为“NULL”,其中同一行“reservation_id “列的值将是 ”0 <“ 或NOT NULL”SQL Server Management Studio - 更新后更新案例

较短的解释 - 。如果行 “reservation_id”= NOT NULL然后设置 “gift_id”= NULL

内我都拿出了这一点,但我不能得到这个触发器正确。有人可以给我一个提示吗?

CREATE TRIGGER add_reservation 
ON [dbo].[order] 
AFTER UPDATE 
AS BEGIN 
    UPDATE [dbo].[order] 
     CASE 
     WHEN [reservation_id] > 0 
     THEN SET [gift_id] = NULL 
     END 
END 
GO 

似乎有一个语法错误:

Msg 156, Level 15, State 1, Procedure add_reservation, Line 6
Incorrect syntax near the keyword 'CASE'.

+1

'CASE'在T-SQL是一个**表达**(像'a + b'),它只能返回一个单一的原子值** - 它并不意味着控制程序流或类似的东西.... –

回答

2
CREATE TRIGGER add_reservation 
ON [dbo].[order] 
AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

UPDATE O 
SET O.[gift_id] = NULL 
FROM [dbo].[order] O 
INNER JOIN inserted i ON o.Pk_Col = i.Pk_Col --<-- Primary Key column 
WHERE i.[reservation_id] > 0 
    OR i.[reservation_id] IS NOT NULL 
END 
GO 
+0

工作就像一个魅力!巨大的感谢!你保存了我的学习项目! – John

0

发现从这个 “I want to use CASE statement to update some records in sql server 2005” 后的另一个解决方案由我自己。

它做我想要的,但更新每一行,所以它需要大量的资源和时间。也许它更简单,但不是最好的解决方案。

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 

有人谁是试图做在某些时候我遇到了一些问题,带着

AT LEAST ONE OF THE RESULT EXPRESSIONS IN A CASE SPECIFICATION MUST BE AN EXPRESSION OTHER THAN THE NULL CONSTANT

为了解决这个问题同样只需添加

ELSE [gift_id] 
+0

“像魅力一样工作” - 同时在*每次*更新期间更新表格中的每一行*。我会认真地推荐你使用[M.Ali's answer](http://stackoverflow.com/a/34130324/15498)或者至少检查它并试图理解['inserted' table](https:// msdn .microsoft.com/en-us/library/ms191300.aspx) –

+0

的确,谢谢! [M.Ali解决方案](http://stackoverflow.com/questions/34130245/sql-server-management-studio-after-update-update-case/34130324#34130324)效果更好! – John