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

एसक्यूएल सर्वर में डुप्लीकेट कुंजी अद्यतन पर MySQL के बराबर

आप मूल रूप से एक इन्सर्ट या अपडेट पैटर्न . की तलाश में हैं कभी-कभी अप्सर्ट . के रूप में संदर्भित किया जाता है

मैं इसकी अनुशंसा करता हूं:Sql सर्वर के लिए पैटर्न डालें या अपडेट करें - सैम केसर

एक प्रक्रिया के लिए जो एकल पंक्तियों से निपटेगी, या तो ये लेन-देन अच्छी तरह से काम करेंगे:

सैम केसर का पहला समाधान (इस स्कीमा के लिए अनुकूलित):

begin tran
if exists (
  select * 
    from mytable with (updlock,serializable) 
    where col_a = @val_a
      and col_b = @val_b
      and col_c = @val_c
  )
  begin
    update mytable
      set col_d = @val_d
      where col_a = @val_a
        and col_b = @val_b
        and col_c = @val_c;
  end
else
  begin
    insert into mytable (col_a, col_b, col_c, col_d)
      values (@val_a, @val_b, @val_c, @val_d);
  end
commit tran

सैम केसर का दूसरा समाधान (इस स्कीमा के लिए अनुकूलित):

begin tran
  update mytable with (serializable)
    set col_d = @val_d
      where col_a = @val_a
        and col_b = @val_b
        and col_c = @val_c;
  if @@rowcount = 0
    begin
        insert into mytable (col_a, col_b, col_c, col_d)
          values (@val_a, @val_b, @val_c, @val_d);
     end
commit tran

IGNORE_DUP_KEY . के रचनात्मक उपयोग के साथ भी , आप अभी भी एक सम्मिलित/अद्यतन ब्लॉक या मर्ज कथन का उपयोग करने के लिए अटके रहेंगे।

  • IGNORE_DUP_KEY का रचनात्मक उपयोग - पॉल व्हाइट @Sql_Kiwi
update mytable
  set col_d = 'val_d'
  where col_a = 'val_a'
    and col_b = 'val_b'
    and col_c = 'val_c';

insert into mytable (col_a, col_b, col_c, col_d)
  select 'val_a','val_b', 'val_c', 'val_d'
  where not exists (select * 
    from mytable with (serializable) 
    where col_a = 'val_a'
      and col_b = 'val_b'
      and col_c = 'val_c'
      );

स्पॉक द्वारा प्रदान किया गया मर्ज उत्तर वही करना चाहिए जो आप चाहते हैं।

मर्ज करें आवश्यक रूप से अनुशंसित नहीं है। मैं इसका उपयोग करता हूं, लेकिन मैं इसे @AaronBertrand को कभी स्वीकार नहीं करूंगा।

  • SQL सर्वर के MERGE स्टेटमेंट के साथ सावधानी बरतें - आरोन बर्ट्रेंड

  • क्या मैं इस मर्ज स्टेटमेंट को ऑप्टिमाइज़ कर सकता हूँ - आरोन बर्ट्रेंड

  • यदि आप अनुक्रमित दृश्यों और 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. अमान्य स्तंभ नाम sql त्रुटि

  2. दो SQL सर्वर डेटाबेस (स्कीमा और डेटा) की तुलना करने के लिए सबसे अच्छा उपकरण क्या है?

  3. SQL सर्वर डिफ़ॉल्ट इंस्टेंस और SQL सर्वर नामांकित इंस्टेंस से कैसे कनेक्ट करें - SQL सर्वर / TSQL ट्यूटोरियल भाग 2

  4. SQL सर्वर में VARCHAR और NVARCHAR में क्या अंतर है - SQL सर्वर / T-SQL ट्यूटोरियल भाग 32

  5. बिटवाइज़-या एक सबक्वेरी में एकत्रित करें