ЕСЛИ ЕЩЕ РАЗ с SQL Триггер сервера - PullRequest
0 голосов
/ 18 апреля 2020

Я заполняю таблицу полностью, используя триггеры, она заполняет таблицу, если LocationID и ProductID не существует и обновляет заданные данные, если она уже существует.

Я разместил следующий фрагмент кода в поисках возможного решения или ссылку на него.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[newpurchase] 
ON [dbo].[PurchaseMaster]
AFTER INSERT 
AS
BEGIN
    IF (((SELECT COUNT(*) FROM StockMaster 
          WHERE LocationID = (SELECT LocationID FROM inserted)) > 0) 
       AND ((SELECT COUNT(*) FROM StockMaster 
             WHERE LocationID = (SELECT LocationID FROM inserted)) > 0))

        UPDATE StockMaster 
        SET TotalPurchased = TotalPurchased + (SELECT PurchasedQTY FROM inserted) 
        WHERE LocationID = (SELECT LocationID FROM inserted) 
          AND ProductID = (SELECT ProductID FROM inserted);
    ELSE 
        INSERT INTO StockMaster (LocationID, ProductID, TotalPurchased, TotalSold, OnHand) 
            SELECT LocationID, ProductID, PurchasedQTY, 0, 0 FROM inserted;
    END

1 Ответ

0 голосов
/ 18 апреля 2020

Я не совсем уверен, что именно вы ищете. Если ваши возвращаемые наборы не могут быть собраны динамически, и вам нужна другая таблица, чтобы всегда обновлять информацию, сохраненную другой другой таблицей, тогда я думаю, что триггеры в порядке. С триггерами всегда накладные расходы, так что имейте это в виду.

Вы можете сделать то, что делаете, и из того, что я вижу на поверхностном уровне, триггер может быть тем, что вы ищете (но это также зависит от ваших бизнес-потребностей и взаимосвязей таблиц). ОДНАКО, вы должны быть осторожны, если ваша вставка является массовой вставкой, то, что у вас есть, выдаст ошибку.

Я также заметил, что ваш оператор If дважды проверяет LocationId вместо LocationId и ProductId.

Триггер, который вы пытаетесь создать, работает только с одним значением за раз. Вы можете переписать это в более основанный на триггере случай, когда происходят массовые вставки. Таким образом, если у вас есть одна вставка или массовая вставка, эти два запроса могут выполняться для этих значений, где это необходимо.

сначала вы хотите обновить все значения, где LocationId и ProductId> одинаковы, найденные в StockMaster, если не найдено ни одного значения, тогда ничего не будет обновлено

Update StockMaster    
    Set TotalPurchased = sm.TotalPurchased + i.PurchasedQty    
From StockMaster sm     
inner join inserted i on sm.LocationId = i.LocationId and sm.ProductId = i.ProductId

далее вы хотите вставить любую строку, которая не найдена в StockMaster, если все значения соответствуют вышеприведенным, они будут отсеяны с условием wheree>, и тогда ничего не будет вставлено, те, которые не соответствуют, будут вставлены

INSERT INTO StockMaster (LocationID, ProductID, TotalPurchased, TotalSold, OnHand)     
    SELECT i.LocationID, i.ProductID, i.PurchasedQTY, 0, 0     
    FROM inserted i    
    left join StockMaster sm on i.LocationId = sm.LocationId and i.ProductId = sm.ProductId    
where sm.{Id} is null;--not {id} is for whatever key this table uses
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...