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

SQL सर्वर MERGE स्टेटमेंट के लिए केस का उपयोग करें:ऑनलाइन और हिस्ट्री टेबल्स को सिंक करना

परिचय

SQL सर्वर MERGE कथन दो तालिकाओं या दो डेटा सेटों की तुलना के आधार पर DML संचालन करने के लिए एक अविश्वसनीय रूप से उपयोगी उपकरण है। इस कथन का उपयोग वास्तव में एक ही कथन में एकाधिक संचालन करने जैसा है।

यह लेख तीन उपयोग के मामलों का पता लगाएगा जो एक ऑनलाइन तालिका और एक इतिहास तालिका के बीच समन्वयन में डेटा सुनिश्चित करने की सीमा पर हैं।

आइए कुछ उल्लिखित बयानों में परिदृश्य का वर्णन करें जो कई डीबीए या डेवलपर्स से परिचित होंगे:

  1. स्रोत तालिका जिसे ट्रान . कहा जाता है रीयल-टाइम में चल रहे लेनदेन को कैप्चर करता है।
  2. टेबल ट्रान के लिए सहमत प्रतिधारण अवधि एक महीने है। ट्रैन को हर महीने के अंत में शुद्ध किया जाना चाहिए।
  3. दैनिक, ट्रैन के डेटा को TranHistory . पर पुश किया जाना चाहिए "दिन के अंत" प्रक्रिया के दौरान।
  4. ट्रेनहिस्ट्री तालिका एक ऐतिहासिक तालिका है जो एक वर्ष में लेन-देन डेटा एकत्र करती है।
  5. Tran . पर सभी प्रविष्टियां और अपडेट तालिका TranHistory . में प्रतिबिंबित होनी चाहिए प्रत्येक दिन के अंत में तालिका।

परिदृश्य तैयार करना

ऊपर वर्णित परिदृश्य का तात्पर्य है कि ट्रान तालिका में रिकॉर्ड भी तालिका ट्रैनहिस्ट्री में मौजूद हैं जब तक कि उन्हें मासिक रूप से शुद्ध नहीं किया जाता है। प्रत्येक दिन, ट्रैन टेबल में कुछ नए रिकॉर्ड होंगे लेकिन ट्रैनहिस्ट्री टेबल में नहीं। हमें इन नई पंक्तियों को सम्मिलित करने का एक तरीका खोजना होगा।

सबसे पहले, आइए विचाराधीन टेबल तैयार करें (सूची 1 और 2 देखें)।

-- Listing 1: Create Tran Table
USE AU
GO
CREATE TABLE [Tran] (
  responseId int NOT NULL ,
  senderId varchar(15) ,
  msisdn varchar(15) ,
  [message] varbinary ,
  status smallint ,
  application varchar ,
  receivedTime timestamp NULL ,
  processedTime datetime2 NULL ,
  flag smallint ,
  requestDelivery smallint ,
  delivered smallint ,
  account varchar(20) ,
  srcTon smallint ,
  srcNpi smallint ,
  destTon smallint ,
  destNpi smallint ,
  errorCode smallint ,
  messageId varchar ,
  sequenceNo int ,
  retries smallint ,
  messagePriority int ,
  userId varchar(20) ,
  bulkId varchar(20) 
)
-- Listing 2: Create TranHistory Table
USE AU
GO
CREATE TABLE [TranHistory] (
  responseId int NOT NULL ,
  senderId varchar(15) ,
  msisdn varchar(15) ,
  [message] varchar(160) ,
  status smallint ,
  application varchar ,
  receivedTime datetime2 NULL ,
  processedTime datetime2 NULL ,
  flag smallint ,
  requestDelivery smallint ,
  delivered smallint ,
  account varchar(20) ,
  srcTon smallint ,
  srcNpi smallint ,
  destTon smallint ,
  destNpi smallint ,
  errorCode smallint ,
  messageId varchar ,
  sequenceNo int ,
  retries smallint ,
  messagePriority int ,
  userId varchar(20) ,
  bulkId varchar(20) ,
  archivedTime datetime2 NOT NULL ,
)

जब मेल न हो तो डालें

लिस्टिंग 3 में कोड का उपयोग करते हुए, हम आरंभ करने के लिए ट्रान तालिका में कुछ पंक्तियाँ सम्मिलित करते हैं। फिर, हम डेटा को TranHistory तालिका में ले जाने के लिए एक MERGE कथन का उपयोग करने के लिए आगे बढ़ते हैं।

-- Listing 3: Insert Initial Set of Rows in Tran Table
USE [AU]
GO

INSERT INTO [dbo].[Tran]
     VALUES
           (8000,'0233456789','Wishing you a Happy New Year',1,'K','20201110 15:00:00','20201110 15:10:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(7777,'0233456789','The blessing of the Lord be with you',1,'K','20201110 08:00:00','20201110 08:10:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(7005,'0234876789','Happy Birthday to you',1,'K','20201110 09:00:00','20201110 09:20:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(9002,'0233456789','Merry Christmas',1,'K','20201110 07:00:00','20201110 07:15:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(6789,'0233467889','Buy our brand new cars for less than $8000',1,'K','20201110 14:00:00','20201110 14:20:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(7685,'0244556789','Happy New Month. God bless and increase you',1,'K','20201110 17:00:00','20201110 17:08:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(4983,'0229856789','Help is coming your way today!',1,'K','20201110 19:00:00','20201110 19:20:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(6879,'0239986789','Call us for your next relocation project',1,'K','20201110 19:15:00','20201110 19:20:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(4567,'0233456789','Hard Work Always Pays',1,'K','20201110 22:05:00','20201110 22:20:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(8890,'0244656733','Don''t wait to buy land, buy land and wait',1,'K','20201110 15:05:00','20201110 15:20:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(6789,'0233466734','We are relocating. Call us on 077788997',1,'K','20201110 18:02:00','20201110 18:17:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(9899,'0233456556','Watch out for our latest movie',1,'K','20201110 06:00:00','20201110 06:02:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(6789,'0233456338','We are here to make you happy',1,'K','20201110 12:16:00','20201110 12:20:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
GO

हम इसे बहुत आसान तरीके से कर सकते थे, लेकिन हम MERGE स्टेटमेंट सिंटैक्स दिखाना चाहते हैं (लिस्टिंग 4 देखें):

-- Listing 4: Merge Records in Tran Table to TranHistory Table
MERGE INTO [TranHistory] a USING [Tran] b
ON a.responseId=b.responseID
WHEN NOT MATCHED BY TARGET THEN INSERT
([responseId],[senderId],[msisdn],[message],[status],[application],[receivedTime],[processedTime],[flag],[requestDelivery],[delivered],[account],[srcTon],[srcNpi],[destTon],[destNpi],[errorCode],[messageId],[sequenceNo],[retries],[messagePriority],[userId],[bulkId],[archivedTime])
 VALUES 
([responseId],[senderId],[msisdn],[message],[status],[application],[receivedTime],[processedTime],[flag],[requestDelivery],[delivered],[account],[srcTon],[srcNpi],[destTon],[destNpi],[errorCode],[messageId],[sequenceNo],[retries],[messagePriority],[userId],[bulkId],getdate());
GO

MERGE स्टेटमेंट कहता है:

  1. [Tran] तालिका की सामग्री लें और responseId के आधार पर [TranHistory] तालिका से उनकी तुलना करें कॉलम।
  2. उन पंक्तियों को सम्मिलित करें जो आपको स्रोत तालिका में मिलती हैं लेकिन लक्ष्य तालिका (TranHistory) में नहीं मिलती हैं।

जैसा कि है, ट्रान और ट्रैनहिस्ट्री प्रति पर हैं। लेकिन मान लीजिए कि अगले दिन, ट्रांस टेबल में नई पंक्तियाँ पेश की जाती हैं। महीना खत्म होने तक हमें ट्रान टेबल में रिकॉर्ड बनाए रखते हुए उन्हें ट्रांसहिस्ट्री टेबल पर भी धकेलना चाहिए।

हम फिर से लिस्टिंग 4 में स्क्रिप्ट का उपयोग करते हैं। इस बार, हम यह बताने के लिए एक OUTPUT क्लॉज जोड़ते हैं कि क्या पेश किया गया था (लिस्टिंग 5 देखें):

-- Listing 5: Merge Records in Tran Table to TranHistory Table (Add OUTPUT Clause)
USE AU
GO

MERGE INTO [TranHistory] a USING [Tran] b
ON a.responseId=b.responseID
WHEN NOT MATCHED BY TARGET THEN INSERT
([responseId],[senderId],[msisdn],[message],[status],[application],[receivedTime],[processedTime],[flag],[requestDelivery],[delivered],[account],[srcTon],[srcNpi],[destTon],[destNpi],[errorCode],[messageId],[sequenceNo],[retries],[messagePriority],[userId],[bulkId],[archivedTime])
 VALUES 
([responseId],[senderId],[msisdn],[message],[status],[application],[receivedTime],[processedTime],[flag],[requestDelivery],[delivered],[account],[srcTon],[srcNpi],[destTon],[destNpi],[errorCode],[messageId],[sequenceNo],[retries],[messagePriority],[userId],[bulkId],getdate())
OUTPUT deleted.*, $action, inserted.*;
GO

ट्रान तालिका (लिस्टिंग 6 और 7) में अतिरिक्त पंक्तियों को पेश करने के बाद हम इस प्रक्रिया को दोहरा सकते हैं, और हमें समान व्यवहार मिलता है:

-- Listing 6: Insert Six New Rows in Tran Table
USE [AU]
GO

INSERT INTO [dbo].[Tran]
     VALUES
			(6879,'0239986789','Call us for your next relocation project',1,'K','20201110 19:15:00','20201110 19:20:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(4567,'0233456789','Hard Work Always Pays',1,'K','20201110 22:05:00','20201110 22:20:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(8890,'0244656733','Don''t wait to buy land, buy land and wait',1,'K','20201110 15:05:00','20201110 15:20:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(6789,'0233466734','We are relocating. Call us on 077788997',1,'K','20201110 18:02:00','20201110 18:17:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(9899,'0233456556','Watch out for our latest movie',1,'K','20201110 06:00:00','20201110 06:02:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(6789,'0233456338','We are here to make you happy',1,'K','20201110 12:16:00','20201110 12:20:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
GO
-- Listing 7: Insert Additional Three Rows in Tran Table
USE [AU]
GO

INSERT INTO [dbo].[Tran]
     VALUES
	(7789,'0233456433','Are you ready for your next level?',1,'K','20201110 14:35:00','20201110 14:40:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(8000,'0233457759','Hutchies Honey, another level of taste',1,'K','20201110 08:00:00','20201110 08:08:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(7777,'0233458909','Make sure you vote tomorrow',1,'K','20201110 09:45:00','20201110 09:50:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
			,(9890,'0233459994','Wishing you a Merry Christmas',1,'K','20201110 10:00:00','20201110 10:05:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
GO

जब मिलान हुआ तो अपडेट करें

एक अन्य मामला लाइव टेबल (ट्रान) का अपडेट है जब हम ऐसे अपडेट को ट्रैनहिस्ट्री टेबल के साथ सिंक करना चाहते हैं। हम लिस्टिंग 8 में स्क्रिप्ट का उपयोग करके ट्रान तालिका में पंक्तियों को अपडेट करके इस परिदृश्य को बनाते हैं।

-- Listing 8: Update and Insert Rows in Tran Table
USE AU
GO

UPDATE [dbo].[Tran] SET account='JUNIPER' 
WHERE account='KAIROS';
GO

INSERT INTO [dbo].[Tran]
     VALUES
	(5578,'0233566933','Newest on the Block!',1,'K','20201110 14:35:00','20201110 14:40:00',1,1,1,'KAIROS',1,2,3,4,1,1,9789,2,1,'ROUTEMOBILE','9988776')
GO

चित्र 6 दिखाता है कि गंतव्य तालिका में पंक्तियों को अद्यतन किया जाता है। हमें यह विवरण OUTPUT क्लॉज का उपयोग करके मिलता है।

हमें लिस्टिंग 9 में हाइलाइट किए गए क्लॉज का उपयोग करना चाहिए। MERGE स्टेटमेंट ने उन पंक्तियों की पहचान की जो JOIN कंडीशन से मेल खाती हैं और निर्दिष्ट कॉलम में डेटा को अपडेट करती हैं (खाता ) हम इस दृष्टिकोण के साथ कई पंक्तियों को अपडेट कर सकते हैं।

-- Listing 9: Sync Data in TranHistory by Updating Rows
USE AU
GO

MERGE INTO [TranHistory] a USING [Tran] b
ON a.responseId=b.responseID
WHEN MATCHED THEN UPDATE
SET a.account=b.account
WHEN NOT MATCHED BY TARGET THEN INSERT
([responseId],[senderId],[msisdn],[message],[status],[application],[receivedTime],[processedTime],[flag],[requestDelivery],[delivered],[account],[srcTon],[srcNpi],[destTon],[destNpi],[errorCode],[messageId],[sequenceNo],[retries],[messagePriority],[userId],[bulkId],[archivedTime])
 VALUES 
([responseId],[senderId],[msisdn],[message],[status],[application],[receivedTime],[processedTime],[flag],[requestDelivery],[delivered],[account],[srcTon],[srcNpi],[destTon],[destNpi],[errorCode],[messageId],[sequenceNo],[retries],[messagePriority],[userId],[bulkId],getdate())
OUTPUT deleted.*, $action, inserted.*;
GO

जब स्रोत से मेल नहीं खाता तो हटाएं

एक और परिदृश्य में स्रोत तालिका (सूची 10) से पंक्तियों को हटाना शामिल है। जब ऐसा होता है, तो हमें उन पंक्तियों की पहचान करनी चाहिए जो अब स्रोत तालिका में मौजूद नहीं हैं और उन्हें गंतव्य तालिका से हटा दें।

हम इसे लिस्टिंग 10 में हाइलाइट किए गए क्लॉज का उपयोग करके पूरा करते हैं। फिर से, आंकड़े 7 और 8 इस MERGE स्टेटमेंट से प्रभावित पंक्तियों को दिखाते हैं।

-- Listing 10: Update and Insert Rows in Tran Table
USE AU
GO

DELETE FROM [dbo].[Tran] 
WHERE account='JUNIPER';
GO
-- Listing 11: Syncing Tables After Deleting from Tran Table
USE AU
GO

MERGE INTO [TranHistory] a USING [Tran] b
ON a.responseId=b.responseID
WHEN NOT MATCHED BY SOURCE THEN DELETE
WHEN MATCHED THEN UPDATE
SET a.account=b.account
WHEN NOT MATCHED BY TARGET THEN INSERT
([responseId],[senderId],[msisdn],[message],[status],[application],[receivedTime],[processedTime],[flag],[requestDelivery],[delivered],[account],[srcTon],[srcNpi],[destTon],[destNpi],[errorCode],[messageId],[sequenceNo],[retries],[messagePriority],[userId],[bulkId],[archivedTime])
 VALUES 
([responseId],[senderId],[msisdn],[message],[status],[application],[receivedTime],[processedTime],[flag],[requestDelivery],[delivered],[account],[srcTon],[srcNpi],[destTon],[destNpi],[errorCode],[messageId],[sequenceNo],[retries],[messagePriority],[userId],[bulkId],getdate())
OUTPUT deleted.*, $action, inserted.*;
GO

चित्र 7 हटाई गई पंक्तियों को दिखाता है, और चित्र 8 अद्यतन की गई पंक्तियों को दिखाता है। यह शक्ति है MERGE स्टेटमेंट का। हम सभी एक स्टेटमेंट में डिलीट, इंसर्ट और अपडेट ऑपरेशंस को अंजाम दे सकते हैं।

निष्कर्ष

इस लेख ने दोनों टेबलों में वांछित अवधारण को बनाए रखते हुए एक ऑनलाइन टेबल और एक इतिहास तालिका के बीच डेटा को सिंक करने के लिए MERGE स्टेटमेंट के उपयोग की समीक्षा की।

SQL सर्वर MERGE स्टेटमेंट के लिए कई अन्य उपयोग के मामले हैं जो इस आलेख में शामिल नहीं हैं, लेकिन उन्हें Microsoft दस्तावेज़ में खोजा गया है। USING क्लॉज में निर्दिष्ट स्रोत डेटा तालिकाओं तक सीमित नहीं है। स्पष्ट चयन कथनों के परिणाम सेट स्रोत डेटा हो सकते हैं। सामान्य तालिका भाव भी स्रोत डेटा हो सकते हैं।

संदर्भ

ट्रांजैक्ट-एसक्यूएल में मर्ज करें


  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. एक यूडीएफ एक सबक्वायरी से इतना धीमा क्यों है?

  3. जब DRY सिद्धांत लागू नहीं होता है:SQL सर्वर में बिटवाइज़ संचालन

  4. यदि अन्य कॉलम रिक्त है तो एक कॉलम का चयन करें

  5. SQL सर्वर में स्थिति के आधार पर गणना करें