Handling multiple rows in SQL Server trigger

前端 未结 3 2086
一向
一向 2020-12-19 03:00

We have a database with a table called WarehouseItem where product\'s stock levels are kept. I need to know when ever this table get\'s updated, so I create

3条回答
  •  情书的邮戳
    2020-12-19 03:44

    You could use a loop to iterate over INSERTED but it may be better to change your scalar variables into a TABLE and INSERT-SELECT from INSERTED where the IDs meet the criteria of the first two IFs

    DECLARE @inserted TABLE (StockItemID INT, WarehouseID INT)
    
    INSERT INTO @inserted (StockItemID, WarehouseID)
    SELECT StockItemID, WarehouseID
    FROM INSERTED i
    WHERE dbo.IC_CanSyncProduct(i.StockItemID)=1
    AND dbo.IC_CanSyncStock(i.WarehouseID)=1
    

    then you can remove the if else upsert logic and use queries that further filter @inserted for the various updates and inserts that are required

    ;WITH ResetQueueEntry
    (
        SELECT StockItemID
        FROM @inserted i
        WHERE EXISTS(SELECT 1 FROM IC_ProductCreateQueue q WHERE q.StockItemID = i.StockItemID)
        AND EXISTS(SELECT 1 FROM IC_StockUpdateQueue q WHERE q.StockItemID = i.StockItemID))
    )
    
    -- Reset [StockUpdate] Queue Entry
    UPDATE IC_StockUpdateQueue 
    SET Synced = 0
    WHERE StockItemID IN (SELECT StockItemID FROM ResetStockUpdate);
    
    WITH InsertQueueEntry
    (
         SELECT StockItemId, 0 Synced
         FROM @inserted
         WHERE EXISTS(SELECT 1 FROM IC_ProductCreateQueue q WHERE q.StockItemID = i.StockItemID)       
         AND NOT EXISTS(SELECT 1 FROM IC_StockUpdateQueue q WHERE q.StockItemID = i.StockItemID))
    )
    -- Insert [StockUpdate] Queue Entry
    INSERT INTO IC_StockUpdateQueue (StockItemID, Synced)
    SELECT StockItemID, Synced
    FROM InsertQueueEntry
    
    WITH CreateProductEntry
    (
         SELECT StockItemId, 0 Synced
         FROM @inserted
         WHERE NOT EXISTS(SELECT 1 FROM IC_ProductCreateQueue q WHERE q.StockItemID = i.StockItemID)
    )
    -- Insert [ProductCreate] Queue Entry
    INSERT INTO IC_ProductCreateQueue (StockItemID, Synced)
    SELECT StockItemId, Synced
    FROM CreateProductEntry
    
    WITH CreateStockEntry
    (
         SELECT StockItemId, 0 Synced
         FROM @inserted
         WHERE NOT EXISTS(SELECT 1 FROM IC_ProductCreateQueue q WHERE q.StockItemID = i.StockItemID)
    )
    -- Insert [StockUpdate] Queue Entry
    INSERT INTO IC_StockUpdateQueue (StockItemID, Synced)
    SELECT StockItemId, Synced
    FROM CreateProductEntry
    

提交回复
热议问题