क्वेरी ऑप्टिमाइज़र आपके T-SQL बैच का एक स्थिर विश्लेषण करता है, और जैसे ही यह MERGE स्टेटमेंट देखता है, यह आवश्यकताओं को मान्य करेगा। यह MERGE स्टेटमेंट से पहले ट्रिगर्स को प्रभावित करने वाले किसी भी DDL स्टेटमेंट को शामिल नहीं करेगा।
आप बयानों को अलग-अलग बैचों में तोड़ने के लिए GO का उपयोग करके इस पर काम कर सकते हैं, लेकिन यदि यह एक ही SP (कोई GO स्टेटमेंट) में है, तो आपके पास दो विकल्प हैं
- मेर्ज को एक ऐसे सपोर्ट एसपी में डालें जिसे मेन कॉल करता है; या
- गतिशील SQL का उपयोग करें
डायनामिक SQL
आइए एक ट्रिगर के साथ एक टेबल बनाएं
create table tg1(i int)
;
create trigger tg1_tg on tg1 instead of insert as
select 1
GO
फिर मेज पर मर्ज करने का प्रयास करें
alter table tg1 disable trigger tg1_tg
;
merge tg1 as target
using (select 1 union all select 3) as source (X) on target.i = source.x
when matched then
delete
when not matched by target then
insert (i) values (x)
output $action, inserted.*, deleted.*
;
alter table tg1 enable trigger tg1_tg
;
अच्छा नहीं..
इसलिए हम डायनेमिक एसक्यूएल का उपयोग करते हैं
alter table tg1 disable trigger tg1_tg
;
exec ('
merge tg1 as target
using (select 1 union all select 3) as source (X) on target.i = source.x
when matched then
delete
when not matched by target then
insert (i) values (x)
output $action, inserted.*, deleted.*
;')
alter table tg1 enable trigger tg1_tg
;
सहायता प्रक्रिया
आइए एक प्रक्रिया बनाएं जो MERGE (एक उत्पादन प्रक्रिया में संभवतः एक तालिका चर होगा, एक #temp तालिका का उपयोग करें या कुछ मापदंडों में लें) का प्रदर्शन करें।
create proc tg1_MERGE as
merge tg1 as target
using (select 1 union all select 3) as source (X) on target.i = source.x
when matched then
delete
when not matched by target then
insert (i) values (x)
output $action, inserted.*, deleted.*
;
GO
नहीं जाना...
इसे बनाने के लिए भी, आपको ट्रिगर्स को अक्षम करना होगा - इसलिए ट्रिगर को अक्षम करें और फिर से खरीद बनाएं - यह इस बार काम करेगा।
अंत में, आप इस बैच को चला सकते हैं जो काम करता है
alter table tg1 disable trigger tg1_tg
;
exec tg1_MERGE
;
alter table tg1 enable trigger tg1_tg
;