SQL Server - CASE中的WHERE?

问题描述 投票:0回答:2

我是SQL Server的新手,我在CASE中实现WHERE语句时遇到了麻烦,特别是对于我正在处理的触发器。

我有2个表,包含以下字段:

Receipt(ItemID,Quantity)

Warehouses(WarehouseID,Stock)

|WarehouseID|Stock|
-------------------
|ARM01      |100  |
|ARM02      |100  |

触发器检查具有特定数量的任何给定项目的行是否被插入,更改或移除到收据,然后减去或添加到仓库表的库存。

因此,如果我在收据中添加200个数量的行,它将从仓库ID“ARM01”的库存中减去100,如果“ARM01”中没有剩余库存(由于只有100个,则没有),将从'ARM02'中减去另外100个。当然,如果'ARM02'的库存为0,它将打印错误但我稍后会担心。

问题是,SQL Server不接受CASE中的WHERE,因为当然,整个CASE已经是SET语句的一部分,而WHERE只是在SET之后。这很奇怪但我在网上找不到这么简单的答案。

我的目标:

CASE 1
UPDATE 'Stock of Table' where 'WarehouseID of Same Table' = 'ARM01'
CASE 2
UPDATE 'Stock of Table' where 'WarehouseID of Same Table' = 'ARM02'

我也意识到库存 - / +数量的微积分反之亦然,现在我也在一个THEN之后的括号中有2个语句,用AND分隔,因为我试图将前100个分配给ARM01,其余的到ARM02。对于错误的代码,这可能是非常非常误导和道歉但是现在我只想弄清楚在哪里使用WHERE语句。

CREATE TRIGGER SubtractStock ON Receipt
FOR INSERT, UPDATE, DELETE
AS
[snipped UPDATE for deleted because it only exchanges '+' for '-' in the operation]
UPDATE Warehouses
SET Stock =
    (CASE
        WHEN inserted.Quantity  <= Stock THEN Stock - Quantity WHERE WarehouseID = 'ARM01'
        WHEN inserted.Quantity > Stock THEN (Stock - Quantity WHERE WarehouseID = 'ARM01')
        AND (Quantity - Stock WHERE WarehouseID = 'ARM02')
        END)
    FROM inserted JOIN Warehouses ON inserted.ItemID = Warehouses.ItemID

谢谢!

sql sql-server triggers case where
2个回答
1
投票

我讨厌触发器,这对于一个人来说是一个坏主意。随着那个方式。

对于ARM01,使用AND将WHERE移动到WHEN:

SET Stock =
    (CASE
        WHEN inserted.Quantity <= Stock AND WarehouseID = 'ARM01'
            THEN Stock - Quantity
...

下一个问题是您需要看两行来设置ARM02的库存,ARM02中的库存是什么,以查看是否需要从ARM02中减去,以及ARM02中的库存减去。因此,在其他地方无法帮助的情况下移动条件。可能有两个更新语句,更新ARM01,带有一个输出子句到临时表或表值变量,以便在ARM01的库存值之前给出,然后用它来更新ARM02的值。

同样,这种复杂的逻辑在触发器内很少适用。


0
投票

请尝试这样...使用适当的别名..

CREATE TRIGGER SubtractStock ON Receipt
FOR INSERT, UPDATE, DELETE
AS
UPDATE W 
SET Stock = CASE 
            WHEN WarehouseID = 'ARM01' AND I.Quantity <= Stock THEN Stock - Quantity 
            WHEN WarehouseID = 'ARM01' AND I.Quantity > Stock THEN Stock - Quantity
            WHEN WarehouseID = 'ARM02' THEN I.Quantity - Stock
        END
FROM inserted I JOIN Warehouses W ON I.ItemID = W.ItemID
© www.soinside.com 2019 - 2024. All rights reserved.