powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Merge
4 сообщений из 4, страница 1 из 1
Merge
    #39817520
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,
Мне нужно написать запрос который использует MERGE нескольких записей в таблицу. Если запись уже есть, то надо ее проапдейтить, перед этим записав старые значения в таблицу-историю. Если записи нет, то надо ее вставить.

Вот что у меня получилось:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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 апдейтятся, но в историю старые записи не записываются.

Если убрать комментарии, то выдается синтаксическая ошибка:
Msg 156, Level 15, State 1, Line 67
Incorrect syntax near the keyword 'WHEN'.


Как этот запрос исправить, чтобы он выполнял нужные операции?

Спасибо.
...
Рейтинг: 0 / 0
Merge
    #39817536
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 ] ) ]
;
...
Рейтинг: 0 / 0
Merge
    #39817543
Фотография 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 ';
...
Рейтинг: 0 / 0
Merge
    #39817552
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 ';
святая корова.....
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Merge
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]