Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Merge  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1090
Добрый день,
Мне нужно написать запрос который использует 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 апдейтятся, но в историю старые записи не записываются.

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


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

Спасибо.
24 май 19, 10:04    [21892777]     Ответить | Цитировать Сообщить модератору
 Re: Merge  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
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 май 19, 10:18    [21892802]     Ответить | Цитировать Сообщить модератору
 Re: Merge  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1090
Да, я нашел как правильно сделать, надо было 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]     Ответить | Цитировать Сообщить модератору
 Re: Merge  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
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 май 19, 10:34    [21892827]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить