SQL Server 2008'de başka bir şey varsa güncelleştirme [duplicate]

bu sorunun zaten burada bir cevabı var:

  • SQL Server Ekle veya güncelleştirme çözümleri 21 cevaplar

UPSERT veya başka bir deyişle UPDATE if records exists Else enter new record bir deyim kullanarak SQL Server'da nasıl kullanacağımı bilmek istiyorum?

bu örnek Oracle burada bu ulaşmanın yollarını gösterir Ancak SQL Server de bulunmayan Dual tablosunu kullanır .

yani, herhangi bir SQL Server alternatifleri (saklı yordam yok) lütfen ?

38
tarihinde sordu Community 2014-01-18 23:19:29
kaynak

1 ответов

birçok kişi MERGE kullanmanızı önerir, ancak buna karşı sizi uyarıyorum. Varsayılan olarak, birden çok ifadeden daha fazla eşzamanlılık ve yarış koşullarından sizi korumaz, ancak diğer tehlikeleri de sunar:

http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

bu "daha basit" sözdizimi mevcut olsa bile, hala bu yaklaşımı tercih ediyorum (hata işleme kısalık için ihmal):

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;

bir sürü millet bu şekilde önerecek:

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;

ancak tüm bu gerçekleştirir, güncelleştirilecek satırı(lar) bulmak için tabloyu iki kez okumanız gerekebilir. İlk örnekte, yalnızca bir kez satır(ler) bulmak gerekir. (Her iki durumda da, ilk okumadan hiçbir satır bulunmazsa, bir ekleme oluşur.)

diğerleri bu şekilde önerecektir:

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

bununla birlikte, SQL Server'ın ilk etapta engellenmiş olabilecek istisnaları yakalamasına izin vermekten başka bir sebep yoksa, hemen hemen her eklentinin başarısız olduğu nadir senaryo dışında çok daha pahalıdır. Burada olduğu kadar kanıtlıyorum:

tek bir açıklama yaparak kazandığınızı düşündüğünüzden emin değilim; hiçbir şey kazandığınızı düşünmüyorum. MERGE tek bir ifadedir, ancak yine de birden fazla işlemi gerçekten gerçekleştirmek zorundadır - bunu yapmadığını düşünmenize rağmen.

89
cevap Aaron Bertrand 2016-02-03 11:27:31
kaynak

Diğer sorular sql-server sql sql-server-2008