Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Roust_m Member Откуда: Сидней Сообщений: 1166 |
Добрый день, Мне нужно написать запрос который использует MERGE нескольких записей в таблицу. Если запись уже есть, то надо ее проапдейтить, перед этим записав старые значения в таблицу-историю. Если записи нет, то надо ее вставить. Вот что у меня получилось: INSERT INTO [dbo].[_test_history] SELECT [id],[assessment_id],[name],[seq_no] FROM ( MERGE [dbo].[_test] AS t USING (SELECT [id], [assessment_id],[name],[seq_no] FROM [dbo].[mytable]) AS src ([id], [assessment_id],[name],[seq_no]) ON t.id = src.id WHEN MATCHED THEN UPDATE SET t.[assessment_id] = src.[assessment_id], t.[name] = 'test', t.[seq_no]= src.[seq_no] OUTPUT $action, deleted.[id], deleted.[assessment_id], deleted.[name], deleted.[seq_no] --WHEN NOT MATCHED THEN --INSERT ([id], [assessment_id],[name],[seq_no]) --VALUES ([id], [assessment_id],[name],[seq_no]) ) AS Changes (Action, [id], [assessment_id], [name], [seq_no]) WHERE Action = 'DELETE'; Если это запустить, то получаю (0 rows affected) 5 записей с таким-же id апдейтятся, но в историю старые записи не записываются. Если убрать комментарии, то выдается синтаксическая ошибка:
Как этот запрос исправить, чтобы он выполнял нужные операции? Спасибо. |
||
24 май 19, 10:04 [21892777] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Roust_m, если вам лень открывать мсдн, то пишите
|
||
24 май 19, 10:18 [21892802] Ответить | Цитировать Сообщить модератору |
Roust_m Member Откуда: Сидней Сообщений: 1166 |
Да, я нашел как правильно сделать, надо было OUTPUT перемместить и использовать "UPDATE" в качестве фильтра, тогда все будет писаться как надо: INSERT INTO [dbo].[_test_history] SELECT [id],[assessment_id],[name],[seq_no] FROM ( MERGE [dbo].[_test] AS t USING (SELECT [id], [assessment_id],[name],[seq_no] FROM [dbo].[mytable]) AS src ([id], [assessment_id],[name],[seq_no]) ON t.id = src.id WHEN MATCHED THEN UPDATE SET t.[assessment_id] = src.[assessment_id], t.[name] = 'test', t.[seq_no]= src.[seq_no] WHEN NOT MATCHED THEN INSERT ([id], [assessment_id],[name],[seq_no]) VALUES ([id], [assessment_id],[name],[seq_no]) OUTPUT $action, deleted.[id], deleted.[assessment_id], deleted.[name], deleted.[seq_no] ) AS Changes (Action, [id], [assessment_id], [name], [seq_no]) WHERE Action = 'UPDATE'; |
24 май 19, 10:28 [21892813] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
святая корова..... |
||
24 май 19, 10:34 [21892827] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |