Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL Server 2008 MERGE स्टेटमेंट - MERGE की अनुमति देने के लिए INSERT ट्रिगर के INSTEAD को अक्षम कैसे करें

क्वेरी ऑप्टिमाइज़र आपके 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
;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में क्लस्टर्ड या नॉन-क्लस्टर इंडेक्स का उपयोग कब करें

  2. क्या SQL क्वेरी से टेक्स्ट फ़ाइल निष्पादित करना संभव है?

  3. SQL सर्वर 2008 - सशर्त क्वेरी

  4. Sql सर्वर 2008 में nvarchar को bigint में बदलें

  5. SQL सर्वर 2014 में मानक संस्करण ग्राहकों के लिए कुछ अच्छी खबरें