我编写了一个触发器将状态从OrderDetails状态更新为Order:
BEGIN
/*
Order Status:
Pending = 0,
Processing = 1,
Proceeded = 2,
Completed = 3,
Cancelled = 4,
Order Detail Status:
Pending = 0,
Processing = 1,
Proceeded = 2,
Emailed = 3,
Ordered = 4,
Cancelled = 5
*/
IF (UPDATE([Status]))
BEGIN
UPDATE [Order]
SET [Status] =
CASE (SELECT MIN(od.[Status]) FROM OrderDetail od WHERE od.OrderId = i.OrderId)
WHEN 5 THEN 4
WHEN 4 THEN 3
WHEN 3 THEN 2
WHEN 2 THEN 2
WHEN 1 THEN 1
WHEN 0 THEN 0
END
FROM INSERTED i
WHERE [Order].Id = i.OrderId
END
END
您可以看到,当OrderDetailStatus =2或3然后OrderStatus = 2,否则OrderStatus = OrderDetailStatus。现在,我必须列出状态的值。那么,是否可以为value语句创建别名,如:
SET [Status] =
CASE (SELECT MIN(od.[Status]) FROM OrderDetail od WHERE od.OrderId = i.OrderId) AS val
WHEN 3 THEN 2
ELSE val
END
FROM INSERTED i
WHERE [Order].Id = i.OrderId
发布于 2018-10-17 10:20:04
我唯一能想到的“缩短”办法是:
UPDATE O
SET [Status] = CASE WHEN od.[Status] BETWEEN 3 AND 5 THEN od.[Status] - 1 ELSE od.[Status] END
FROM [Order] O
JOIN INSERTED i ON O.Id = i.OrderId
CROSS APPLY (SELECT MIN(od.[Status]) AS [Status]
FROM OrderDetail ca
WHERE ca.OrderId = i.OrderId) od;
另外,您应该避免在对象名称中使用保留的(甚至键)单词。ORDER
是Server中的保留字,因此实际上不应该使用。Status
是一个关键词,所以可以,但也应该避免。
https://stackoverflow.com/questions/52852371
复制相似问题