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

अद्यतन करें यदि मौजूद है तो SQL Server 2008 में INSERT करें

बहुत से लोग आपको MERGE . का उपयोग करने का सुझाव देंगे , लेकिन मैं आपको इसके खिलाफ सावधान करता हूं। डिफ़ॉल्ट रूप से, यह आपको एक से अधिक कथनों से अधिक समवर्ती और दौड़ की स्थितियों से नहीं बचाता है, लेकिन यह अन्य खतरों का परिचय देता है:

  • SQL सर्वर के MERGE स्टेटमेंट के साथ सावधानी बरतें
  • यदि आप मर्ज का उपयोग करना चाहते हैं तो क्या न करें
  • एसक्यूएल सर्वर यूपीएसईआरटी पैटर्न और एंटीपैटर्न

यहां तक ​​​​कि इस "सरल" सिंटैक्स के उपलब्ध होने के बावजूद, मैं अभी भी इस दृष्टिकोण को पसंद करता हूं (संक्षिप्तता के लिए छोड़े गए त्रुटि प्रबंधन):

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
UPDATE dbo.table SET ... WHERE PK = @PK;
IF @@ROWCOUNT = 0
BEGIN
  INSERT dbo.table(PK, ...) SELECT @PK, ...;
END
COMMIT TRANSACTION;

इस पर अधिक जानकारी UPSERT यहां पहुंचें:

  • कृपया इस यूपीएसईआरटी विरोधी पैटर्न का उपयोग बंद करें

बहुत से लोग इस तरह से सुझाव देंगे:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
IF EXISTS (SELECT 1 FROM dbo.table WHERE PK = @PK)
BEGIN
  UPDATE ...
END
ELSE
BEGIN
  INSERT ...
END
COMMIT TRANSACTION;

लेकिन यह सब पूरा करता है यह सुनिश्चित कर रहा है कि अद्यतन की जाने वाली पंक्तियों का पता लगाने के लिए आपको तालिका को दो बार पढ़ने की आवश्यकता हो सकती है। पहले नमूने में, आपको केवल एक बार पंक्ति (पंक्तियों) का पता लगाने की आवश्यकता होगी। (दोनों ही मामलों में, यदि प्रारंभिक रीड से कोई पंक्तियाँ नहीं मिलती हैं, तो एक इंसर्ट होता है।)

अन्य इस तरह से सुझाव देंगे:

BEGIN TRY
  INSERT ...
END TRY
BEGIN CATCH
  IF ERROR_NUMBER() = 2627
    UPDATE ...
END CATCH

हालाँकि, यह समस्याग्रस्त है यदि SQL सर्वर को अपवादों को पकड़ने के अलावा किसी अन्य कारण से नहीं, जिसे आप पहले स्थान पर रोक सकते थे, बहुत अधिक महंगा है, दुर्लभ परिदृश्य को छोड़कर जहां लगभग हर सम्मिलन विफल हो जाता है। मैं यहाँ उतना ही साबित करता हूँ:

  • TRY/CATCH में प्रवेश करने से पहले संभावित बाधा उल्लंघनों की जांच करना
  • विभिन्न त्रुटि प्रबंधन तकनीकों का प्रदर्शन प्रभाव

सुनिश्चित नहीं हैं कि आपको क्या लगता है कि एक ही कथन रखने से आपको क्या लाभ होता है; मुझे नहीं लगता कि आपको कुछ हासिल हुआ है। MERGE एक ही कथन है लेकिन फिर भी इसे वास्तव में वैसे भी कई ऑपरेशन करने पड़ते हैं - भले ही यह आपको लगता है कि यह नहीं करता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ADO.NET कॉलिंग T-SQL संग्रहीत कार्यविधि एक SqlTimeoutException का कारण बनती है

  2. एसक्यूएल सर्वर यूनियन लेकिन ऑर्डर रखें

  3. इस क्वेरी के साथ पेजिंग (स्किप / टेक) कार्यक्षमता लागू करें

  4. SQL सर्वर में विदेशी कुंजी निर्भरता कैसे खोजें?

  5. SQL सर्वर (T-SQL) में डेटाबेस की सूची प्राप्त करने के 3 तरीके