Почему использование функции SQL UPDATE () вместе со вставленной таблицей не работает в этом после триггера обновления? - PullRequest
0 голосов
/ 12 октября 2018

Я нашел здесь пару похожих вопросов, которые я использовал, чтобы попытаться решить это дело, но мне кажется, что ничего не работает.Итак, в основном у меня есть таблица Pallet, и мне нужно изменить поле Status, когда поле Loaded изменяется на значение <> на то, что было или <> на NULL , и Status также отличается.Триггер в основном ничего не делает.Итак, у меня есть:

ALTER TRIGGER [dbo].[TR_Status_Change]
   ON [dbo].[Pallet]
   AFTER UPDATE
AS BEGIN

    SET NOCOUNT ON;
    IF UPDATE (Loaded)
    BEGIN
        UPDATE [Pallet] 
        SET PStatus = 3
        FROM [Pallet] P 
        INNER JOIN Inserted I ON P.ID = I.ID
        WHERE P.PStatus <> 3
            AND P.Loaded <> I.Loaded
            AND I.Loaded IS NOT NULL
    END
END

Где ID - это первичный ключ.Значения строки следующие:

before update: Loaded = NULL, Status = 1

after: Loaded = 'somevalue' and Status remains = 1

expected: Status = 3

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Сравнение «Что-то по сравнению с NULL» всегда ложно, поэтому это не удается

AND P.Loaded <> I.Loaded

Попробуйте это.Вам также нужны значения Loaded "before" и "after"

UPDATE [Pallet] 
    SET PStatus = 3
    FROM [Pallet] P 
    INNER JOIN Deleted D ON P.ID = D.ID
    INNER JOIN Inserted I ON P.ID = I.ID
    WHERE P.PStatus <> 3
        AND NOT EXISTS (SELECT I.Loaded INTERSECT SELECT D.Loaded)
        AND I.Loaded IS NOT NULL

INTERSECT внутренне выполняет сравнение "отличается от", а не равенство.Если они отличаются, пересечение не дает строк, поэтому NOT EXISTS дает true

Подробнее о INTERSECT и EXCEPT см. Мой ответ здесь Почему EXCEPT существует в T-SQL?

0 голосов
/ 12 октября 2018

Вот в чем дело: P.Loaded <> I.Loaded

Это никогда не будет правдой, потому что вы сравниваете данные таблицы после обновления ([Pallet P]) с ... данными, которые изтаблица после обновления (Inserted I).

Я думаю, что вы хотите изменить Inserted I на удаленную таблицу, которая содержит значения ДО операции обновления.

...