Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Merge
|
|||
|---|---|---|---|
|
#18+
Добрый день, Мне нужно написать запрос который использует MERGE нескольких записей в таблицу. Если запись уже есть, то надо ее проапдейтить, перед этим записав старые значения в таблицу-историю. Если записи нет, то надо ее вставить. Вот что у меня получилось: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Если это запустить, то получаю (0 rows affected) 5 записей с таким-же id апдейтятся, но в историю старые записи не записываются. Если убрать комментарии, то выдается синтаксическая ошибка: Msg 156, Level 15, State 1, Line 67 Incorrect syntax near the keyword 'WHEN'. Как этот запрос исправить, чтобы он выполнял нужные операции? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2019, 10:04 |
|
||
|
Merge
|
|||
|---|---|---|---|
|
#18+
Roust_m, если вам лень открывать мсдн, то пишите автор[ WITH <common_table_expression> [,...n] ] MERGE [ TOP ( expression ) [ PERCENT ] ] [ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ] USING <table_source> ON <merge_search_condition> [ WHEN MATCHED [ AND <clause_search_condition> ] THEN <merge_matched> ] [ ...n ] [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ] THEN <merge_not_matched> ] [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ] THEN <merge_matched> ] [ ...n ] [ <output_clause> ] [ OPTION ( <query_hint> [ ,...n ] ) ] ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2019, 10:18 |
|
||
|
Merge
|
|||
|---|---|---|---|
|
#18+
Да, я нашел как правильно сделать, надо было 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.05.2019, 10:28 |
|
||
|
Merge
|
|||
|---|---|---|---|
|
#18+
Roust_mДа, я нашел как правильно сделать, надо было 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.05.2019, 10:34 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39817520&tid=1687788]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 240ms |
| total: | 408ms |

| 0 / 0 |
