मान लें कि आप एक वास्तविक 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)
. का उपयोग करता हूं अभी संकेत दें, और मैं केवल सबसे सीधे मामलों में कथन का उपयोग करना पसंद करता हूं।