2016-10-08 5 views
3

У меня есть триггер SQL, который запускает обновление таблицы. Когда таблица обновляется, она изменяет некоторые поля в другой таблице.MSSQL trigger on UPDATE: поддержка нескольких обновлений строк

Кажется, что это работает, но я не уверен, правильно ли установлен статус, установленный (если он содержит несколько строк). Я протестировал его и получил правильный ответ (но все же я подозреваю, что это не правильный/лучший способ).

CREATE TRIGGER [dbo].[myTrigger] 
ON [dbo].[myTable] 
AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON 

    declare @OldStatus int 
    declare @NewStatus int 
    select @OldStatus = [currentStatus] FROM INSERTED 

    if @OldStatus = 1 or @OldStatus = 3 or @OldStatus = 5 
    begin 
     set @NewStatus = 1 
    end 
    if @OldStatus = 8 or @OldStatus = 9 
    begin 
     set @NewStatus = 8 
    end 
    if @OldStatus = 11 or @OldStatus = 12 or @OldStatus = 13 
    begin 
     set @NewStatus = 11 
    end 

    UPDATE myNewTable SET  [LastModifiedDate] = GETDATE(), 
           [Status] = @NewStatus, 
           [Type] = inserted.Type 
    FROM inserted 
    WHERE ([id] = inserted.id) 
END 

Я думаю, что правильным решением было бы что-то вроде:

UPDATE myNewTable SET  [LastModifiedDate] = GETDATE(), 
          [Status] = ***<add logic here>***, 
          [Type] = inserted.Type 
FROM inserted 
WHERE ([id] = inserted.id) 
+0

'выбрать @OldStatus = [CurrentStatus] FROM INSERTED'> > Это неправильно. Вы назначаете последний '[currentStatus]' как возвращаемый из таблицы 'SELECT' на' INSERTED'. –

ответ

1

Вам нужно что-то вроде этого:

CREATE TRIGGER [dbo].[myTrigger] 
    ON [dbo].[myTable] 
    AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE 
     myNewTable 
    SET 
     LastModifiedDate=GETDATE(), 
     Status= 
      CASE 
       WHEN i.currentStatus IN (1,3,5) THEN 1 
       WHEN i.currentStatus IN (8,9) THEN 8 
       WHEN i.currentStatus IN (11,12,13) THEN 11 
       ELSE NULL -- if the current status isn't in the cases above 
      END, 
     Type=i.Type 
    FROM 
     myNewTable AS mnt 
     INNER JOIN inserted AS i ON 
      i.id=mnt.id; 
END 

 Смежные вопросы

  • Нет связанных вопросов^_^