Кажется, вы предполагаете, что триггер сервера SQL будет запущен отдельно для каждой строки - это НЕ случай - триггер срабатывает только один раз для оператора. И если это BULK INSERT
, то псевдотаблица Inserted
будет содержать несколько строк - поэтому ваши утверждения типа
set @Barcode = (Select barcodeFull from inserted);
на самом деле являются источником проблемы - что один из 250 вставленных строк вы выбираете здесь? Это не определено - вы получите одну произвольную строку - и что происходит с другими 249 вставленными строками ?? Они просто игнорируются и не обрабатываются.
Вам необходимо переписать всю вашу логику триггера c, чтобы она была на основе набора , и обрабатывать тот факт, что Inserted
псевдо-таблица, скорее всего, будет содержать несколько строк.
Попробуйте что-то вроде этого:
ALTER TRIGGER [dbo].[DiscountUpdate]
ON [dbo].[t_PromoDtl]
INSTEAD OF INSERT
AS
BEGIN
-- update "dbo.T_Prd.PrdDiscnt" to "disPer" when status is 2
UPDATE p
SET PrdDiscnt = i.disPer
FROM dbo.T_Prd p
INNER JOIN Inserted i ON i.BarcodeFull = p.BarcodeFull
WHERE i.Status = 2;
-- update "dbo.T_Prd.PrdDiscnt" to "0" when status is not 2
UPDATE p
SET PrdDiscnt = 0
FROM dbo.T_Prd p
INNER JOIN Inserted i ON i.BarcodeFull = p.BarcodeFull
WHERE i.Status <> 2;
Я предполагаю, что BarcodeFull
- ваш столбец первичного ключа , который однозначно идентифицирует каждую строку в вашей таблице - если это не так, вам может потребоваться адаптировать условие JOIN для соответствия вашей ситуации.