2011-11-24 13 views
6

Diyelim ki bir masa var ve bir satır eklemek istiyorum. Yeni satırın anahtarı zaten mevcut satırın anahtarını masadakiyle eşleştirebilir, bu durumda mevcut satırı güncellemek istiyorum. Ya da, tabloda mevcut olmayabilir, bu durumda, yeni satır eklenmelidir.T-SQL Tek bir hızlı işlemle bir Güncelleme/Ekleme yapmak mümkün mü

Böyle bir işlemi gerçekleştirmenin en etkili yolu nedir? Öncelikle SELECT (belki de EXISTS ile) özel bir anahtarın mevcut olup olmadığını, ardından UPDATE ve varsa INSERT'u takip ettiğini düşünüyordum. Aynı zamanda, yarış koşullarından kaçınmak için bu ifadeler kombinasyonu için bir UPDLOCK ve bir HOLDLOCK tutmanız gerekecektir. Bu aşırı karmaşık ve verimsiz görünüyor.

SQL Server 2008R2'de bunu yapmanın daha verimli bir yolu olup olmadığını merak ediyordum.

cevap

10

SQL Server 2008 ve daha yenisi, tam olarak bunu yapan bir MERGE deyimine sahiptir. Ayrıntılar için MSDN Books Online docs on MERGE numaralı ürüne bakın.

  • bir kaynak (tablo veya görünüm veya satır içi SELECT deyimi)
  • bir hedef
  • bir iki
  • bağlantılar koşulu JOIN:

    Temel olarak, dört şeye ihtiyacı

  • bir MATCH (hem kaynakta hem de hedefte satırlar var) durumlarının bildirimleri, NOT MATCHED (satırda kat olmadığı zamanlar) Henüz olsun) ve benzeri

Yani kısaca şöyle tanımlar:

MERGE (targettable) AS t 
USING (sourcetable) AS s 
ON (JOIN condition between s and t) 
WHEN MATCHED THEN 
    UPDATE SET t.Col1 = s.Col1, t.Col2 = s.Col2 (etc.) 
WHEN NOT MATCHED THEN 
    INSERT(Col1, Col2, ..., ColN) VALUES(s.Col1, s.Col2, ......, s.ColN) 

Bu seferki ifadesi olarak yapılan ve oldukça SQL Server tarafından optimize edilmiştir.

+0

Çok iyi cevap, +1 ve kabul et ... –

İlgili konular