UPSERT kavramına benzer bir T-SQL komutuyla karşılaşıp karşılaşmadığınızı merak ediyordum. (1) veya (2) seçeneklerini kullanarak INSERT | UPDATE işlemlerini gerçekleştirmek aşırı karmaşık ve hataya açık görünüyor.
AMAÇ
İstenen kaydın (bu durumda çalışan_kimliği 1) güncel olduğundan emin olmak için, aynı sorguyu esasen iki kez yazmak zorunda kalmadan.
BAĞLAM
- tablo adı: çalışan
- çalışan kimliği: birincil bir anahtarı var ve kimlik özelliği doğru olarak ayarlanmış
SEÇENEKLER
SQL UPDATE yürütme ... check @@ rowcount = 0 ve @@ error = 0 ... gerekirse SQL INSERT yürütme
- con: Aynı sorguyu, biri ek olarak, bir kez güncelleme olarak iki kez etkili bir şekilde yazmanız gerekir
- con: daha fazla kod = daha fazla zaman yazmak
- con: daha fazla kod = hata için daha fazla alan
/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure "@@ rowcount kullanarak güncelleme"
- SQL MERGE yürütme
- con: Aynı sorguyu, biri ek olarak, bir kez güncelleme olarak iki kez etkili bir şekilde yazmanız gerekir
- con: daha fazla kod = daha fazla zaman yazmak
- con: daha fazla kod = hata için daha fazla alan
http://technet.microsoft.com/tr-tr/library/bb510625.aspx "T-SQL Birleştirme"
- SQL UPSERT yürütme (özellik mevcut değil)
- pro: veri-tablo ilişkisini bir kez tanımlarsınız (SQL Server'ın bir INSERT veya UPDATE olup olmadığı konusunda endişelenmesine izin verin)
- pro: daha az kod = daha hızlı uygulama
- pro: daha az kod = daha düşük olasılık
UPSERT ÖRNEĞİ
UPSERT çalışanı (çalışan_kimliği, çalışan_sayısı, iş_başlığı, ad_adı, orta_adı, soyadı, değiştirilmiş_at) DEĞERLER (1, '00 -124AB37 ',' Yönetici ',' John ',' T ',' Smith ', GetDate ());
- çalışan_kimliği 1 yoksa: MS SQL bir INSERT deyimi yürütür
- çalışan_kimliği 1 varsa: MS SQL yürütülür ve UPDATE deyimi
MERGE
basit, esnek ve aynı zamanda SQL Standardının bir parçasıdır. Gerçek sorun MERGE
ve diğer UPSERT
uygulamalar, sözdizimi ile hiçbir ilgisi olmayan potansiyel kilit yükseltme ve hatta çıkmazlardır.
MERGE
SQL Server'da uygulama hakkında bir diatribe .