Я не совсем уверен, что именно вы ищете. Если ваши возвращаемые наборы не могут быть собраны динамически, и вам нужна другая таблица, чтобы всегда обновлять информацию, сохраненную другой другой таблицей, тогда я думаю, что триггеры в порядке. С триггерами всегда накладные расходы, так что имейте это в виду.
Вы можете сделать то, что делаете, и из того, что я вижу на поверхностном уровне, триггер может быть тем, что вы ищете (но это также зависит от ваших бизнес-потребностей и взаимосвязей таблиц). ОДНАКО, вы должны быть осторожны, если ваша вставка является массовой вставкой, то, что у вас есть, выдаст ошибку.
Я также заметил, что ваш оператор 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