gpt4 book ai didi

sql-server - 在 SQL Server 触发器中处理多行

转载 作者:行者123 更新时间:2023-12-02 16:27:45 25 4
gpt4 key购买 nike

我们有一个数据库,其中有一个名为WarehouseItem的表,其中保存了产品的库存水平。我需要知道该表何时更新,因此我创建了一个触发器来放置已更新的表行的主键;到一个单独的表(如队列系统)中。

这是我的触发器:

IF ((SELECT COUNT(*) FROM sys.triggers WHERE name = 'IC_StockUpdate') > 0)
DROP TRIGGER [dbo].[IC_StockUpdate]
GO
CREATE TRIGGER [dbo].[IC_StockUpdate] ON [dbo].[WarehouseItem]
AFTER UPDATE
AS
BEGIN

-- Get Product Id
DECLARE @StockItemID INT = (SELECT ItemID FROM INSERTED);
DECLARE @WarehouseID INT = (SELECT WarehouseID FROM INSERTED);

-- Proceed If This Product Is Syncable
IF (dbo.IC_CanSyncProduct(@StockItemID) = 1)
BEGIN

-- Proceed If This Warehouse Is Syncable
IF (dbo.IC_CanSyncStock(@WarehouseID) = 1)
BEGIN

-- Check If Product Is Synced
IF ((SELECT COUNT(*) FROM IC_ProductCreateQueue WHERE StockItemID = @StockItemID) > 0)
BEGIN

-- Check If Stock Update Queue Entry Already Exists
IF ((SELECT COUNT(*) FROM IC_StockUpdateQueue WHERE StockItemID = @StockItemID) > 0)
BEGIN

-- Reset [StockUpdate] Queue Entry
UPDATE IC_StockUpdateQueue SET Synced = 0
WHERE StockItemID = @StockItemID;

END
ELSE
BEGIN

-- Insert [StockUpdate] Queue Entry
INSERT INTO IC_StockUpdateQueue (StockItemID, Synced) VALUES
(@StockItemID, 0);

END

END
ELSE
BEGIN

-- Insert [ProductCreate] Queue Entry
INSERT INTO IC_ProductCreateQueue (StockItemID, Synced) VALUES
(@StockItemID, 0);

-- Insert [StockUpdate] Queue Entry
INSERT INTO IC_StockUpdateQueue (StockItemID, Synced) VALUES
(@StockItemID, 0);

END

END

END

END
GO

如果仅在“WarehouseItem”表中更新一行,则效果非常好。但是,如果此表中更新了多行,我的触发器将无法处理它:

enter image description here

有没有办法在批量更新事件后迭代“插入”集合?或者如何处理触发器中的多行更新?

最佳答案

你使用这个:

-- Get Product Id
DECLARE @StockItemID INT = (SELECT ItemID FROM INSERTED);
DECLARE @WarehouseID INT = (SELECT WarehouseID FROM INSERTED);

但是,如果您更新多行(作为示例),则必须使用不同的策略。

例如,要声明变量,请在现在使用变量的查询中的 JOIN 中使用 INSERTED 表。

IF 语句适用于您的变量,但我认为在查询中移动该条件。

尝试以这种方式更改 UPDATE 查询(最终添加 IF 条件):

-- Reset [StockUpdate] Queue Entry
UPDATE IC_StockUpdateQueue SET Synced = 0
FROM inserted
WHERE inserted.itemID = StockItemID;

等等。

欲了解更多信息,请添加评论。

关于sql-server - 在 SQL Server 触发器中处理多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18695815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com