вторник, 27 марта 2012 г.

Оператор DML MERGE в MS SQL SERVER 2008

На днях все таки применил оператор 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!