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

डेटा अपडेट करने के लिए SQL MERGE स्टेटमेंट

मान लें कि आप एक वास्तविक SQL सर्वर MERGE चाहते हैं कथन:

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
USING dbo.temp_energydata AS source
    ON target.webmeterID = source.webmeterID
    AND target.DateTime = source.DateTime
WHEN MATCHED THEN 
    UPDATE SET target.kWh = source.kWh
WHEN NOT MATCHED BY TARGET THEN
    INSERT (webmeterID, DateTime, kWh)
    VALUES (source.webmeterID, source.DateTime, source.kWh);

यदि आप भी लक्ष्य में ऐसे रिकॉर्ड हटाना चाहते हैं जो स्रोत में नहीं हैं:

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
USING dbo.temp_energydata AS source
    ON target.webmeterID = source.webmeterID
    AND target.DateTime = source.DateTime
WHEN MATCHED THEN 
    UPDATE SET target.kWh = source.kWh
WHEN NOT MATCHED BY TARGET THEN
    INSERT (webmeterID, DateTime, kWh)
    VALUES (source.webmeterID, source.DateTime, source.kWh)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;

क्योंकि यह थोड़ा अधिक लोकप्रिय हो गया है, मुझे ऐसा लगता है कि मुझे इस उत्तर को कुछ चेतावनियों के साथ थोड़ा विस्तारित करना चाहिए, जिसके बारे में पता होना चाहिए।

सबसे पहले, ऐसे कई ब्लॉग हैं जो MERGE के साथ समवर्ती समस्याएं कथन SQL सर्वर के पुराने संस्करणों में। मुझे नहीं पता कि बाद के संस्करणों में इस मुद्दे को कभी संबोधित किया गया है या नहीं। किसी भी तरह से, HOLDLOCK . निर्दिष्ट करके इसे काफी हद तक हल किया जा सकता है या SERIALIZABLE लॉक संकेत:

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
[...]

आप अधिक प्रतिबंधात्मक लेन-देन अलगाव स्तरों के साथ भी यही काम पूरा कर सकते हैं।

कई अन्य ज्ञात समस्याएं हैं ए> MERGE . के साथ . (ध्यान दें कि चूंकि माइक्रोसॉफ्ट ने कनेक्ट को न्यूक किया है और पुराने सिस्टम में मुद्दों को नए सिस्टम में मुद्दों से नहीं जोड़ा है, इन पुराने मुद्दों को ट्रैक करना मुश्किल है। धन्यवाद, माइक्रोसॉफ्ट!) जो मैं बता सकता हूं, उनमें से अधिकतर आम नहीं हैं समस्याओं या ऊपर के समान लॉकिंग संकेतों के साथ काम किया जा सकता है, लेकिन मैंने उनका परीक्षण नहीं किया है।

वैसे भी, हालांकि मुझे कभी भी MERGE . के साथ कोई समस्या नहीं हुई है कथन स्वयं, मैं हमेशा WITH (HOLDLOCK) . का उपयोग करता हूं अभी संकेत दें, और मैं केवल सबसे सीधे मामलों में कथन का उपयोग करना पसंद करता हूं।



  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. शीर्ष 100 प्रतिशत चुनें का उपयोग क्यों करें?

  3. शहर x और y के बीच कुल यात्रा घंटों की गणना कैसे करें और इसके विपरीत

  4. ओरेकल:एसक्यूएल सर्वर के लिए प्रोफाइलर जैसे प्रश्नों का पता लगाने के लिए कोई उपकरण है?

  5. SQL सर्वर 2014 के लिए अनुशंसित इंटेल प्रोसेसर - मार्च 2015