На днях все таки применил оператор DML MERGE, довольно сложный для первоначального понимания, но удобен и есть свои преимущества, если его освоить.
Данный оператор был введен в MS SQL с версии 2008 в дополнение к сущеcтвующим инструкциям DML. Вкратце, его назначение - это применение нескольких инструкций на основание нескольких операторов сравнения, более подробно в первоисточнике -http://msdn.microsoft.com/ru-ru/library/bb510625.aspx
Попробую его описать на моем примере, т.к довольно трудно его понять сразу:
merge dbo.INCAS_GRAF as t
using (select a.recid,a.ID,t.graf
from dbo.temp_graf t inner join ATM a on t.idterminal=a.ID
) as s
on (t.ParentLink_RecID=s.recid)
when matched
then update set t.Graf=s.graf,t.LastModDateTime=getdate(),t.LastModBy='admin'
when not matched by target
then insert (RecId,LastModDateTime,LastModBy,CreatedDateTime,CreatedBy,ParentLink_RecID,GRAF)
values(NEWID(),GETDATE(),'admin',Getdate(),'admin',s.recid,s.graf);
что он делает по шагам:
1) merge dbo.INCAS_GRAF as t -устанавливает, с какой таблицой будут действия(update, insert, delete), в BOL описана как таблица TARGET, т.е цель
2) (select a.recid,a.ID,t.graf
from dbo.temp_graf t inner join ATM a on t.idterminal=a.ID
) - устанавливает 2-ю таблицу - SOURCE
3) (t.ParentLink_RecID=s.recid) - устанавливает связь двух таблиц
4)when matched -описание действий при совадение строк, в моем случае это UPDATE
5)when not matched by target -описание действий со строками которых нет в TARGET, но есть в SOURCE, точнее в том случае если есть строки, которых нет в TARGET. В моем примере, это вставка новых строк в таблицу TARGET.
Вот и все, при выполнения данного запроса, если проанализировать план его выполнения, то он будет намного приятным, если мы бы выполняли данные операции отдельно, что довольно хорошо отразится на операциях с I\O.
Еще полезное, возможность применения аргумента OUTPUT, что позволяет нам получить все данные, которые были изменены\вставлены.
Enjoy it!
Комментариев нет :
Отправить комментарий