SQL Insert триггер для обновления значений таблицы INSERTED

Я хочу создать триггер Insert, который обновляет значения для всех вставленных строк, если они равны null, новые значения должны быть взяты из другой таблицы в соответствии с другим столбцом во вставленной таблице.

Я пробовал:

UPDATE INSERTED
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1
    )
WHERE ValueCol IS NULL

Но я получаю эту ошибку:

Msg 286, Level 16, State 1, Procedure ThisTable_INSERT, Line 15
The logical tables INSERTED and DELETED cannot be updated.

Как мне это сделать?

Ответ 1

Вам нужно обновить таблицу назначения, а не логическую таблицу. Однако вы подключаетесь к логической таблице, чтобы выяснить, какие строки обновлять:

UPDATE YourTable
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1
    )
FROM YourTable Y
JOIN Inserted I ON Y.Key = I.Key
WHERE I.ValueCol IS NULL

Ответ 2

Вы можете сменить триггер на INSTEAD OF INSERT. Это позволит вам проверить входящие значения и, при необходимости, заменить их значениями из вашей другой таблицы.

CREATE TRIGGER CoolTrigger 
ON MyAwesomeTable 
INSTEAD OF INSERT
AS 
BEGIN  

INSERT MyAwesomeTable (TheValueCol)
SELECT ISNULL(INSERTED.TheValueCol, AnotherTable.TheValueCol) AS TheValueCol
FROM INSERTED
JOIN AnotherTable ON INSERTED.ValueCol1 = AnotherTable.ValueCol1

END

ПРИМЕЧАНИЕ. Триггеры INSTEAD OF НЕ вызывают рекурсию.

Ответ 3

insert into output  
(SELECT t1.ts - INTERVAL (SECOND(t1.ts)%10) SECOND,  
t1.ts - INTERVAL (SECOND(t1.ts)%10) SECOND + INTERVAL 10 SECOND ,sum(t1.data),   
FROM (select * from input   
where unix_timestamp(ts) >= unix_timestamp('2000-01-01 00:00:10')  
and unix_timestamp(ts) < unix_timestamp('2000-01-01 00:01:20')  
)
  as t1   
GROUP BY UNIX_TIMESTAMP(t1.ts) DIV 10 );

Вот откуда идет моя выходная таблица. Таким образом, вставка не осуществляется значениями.

Мне так жаль, но я не могу получить доступ к моей учетной записи отсюда (в офисе),