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 );
Вот откуда идет моя выходная таблица.
Таким образом, вставка не осуществляется значениями.
Мне так жаль, но я не могу получить доступ к моей учетной записи отсюда (в офисе),