Değerler dizisi içeren bir tablo güncelleştirmeye çalışıyorum. Dizideki her öğe, SQL Server veritabanındaki bir tablodaki bir satırla eşleşen bilgiler içerir. Satır zaten tabloda varsa, o satırı verilen dizideki bilgilerle güncelleriz. Aksi takdirde, tabloya yeni bir satır ekliyoruz. Temelde upert tanımladım.
Şimdi, bunu bir XML parametresi alan saklı bir yordamda elde etmeye çalışıyorum. XML kullanıyorum ve tablo değerli param kullanmamın nedeni, ikincisini yaparken, SQL'de özel tür oluşturmak ve bu türü saklı yordamla ilişkilendirmek zorunda olacağım. Saklı yordamda veya db şemasında bir şey değiştirdi, hem saklı yordamı hem de özel türü yeniden yapmak gerekir. Bu durumdan kaçınmak istiyorum. Ayrıca, TVP'nin XML üzerindeki üstünlüğü benim durumum için yararlı değildir, çünkü veri dizisi boyutum asla 1000'i aşmayacaktır. Bu, burada önerilen çözümü kullanamadığım anlamına gelir: SQL Server 2008'de XML kullanarak birden çok kayıt nasıl eklenir
Ayrıca, burada benzer bir tartışma ( UPSERT - MERGE veya @@ rowcount için daha iyi bir alternatif var mı? ) Sormak istediğimden farklı, çünkü bir tabloya birden çok satır eklemeye çalışıyorum .
Ben sadece xml değerlerini yükseltmek için aşağıdaki sorgu kümesini kullanmak umuyordum. Ama bu işe yaramayacak. Bu yaklaşımın yalnızca girdi tek bir satır olduğunda işe yarayacağı düşünülmektedir.
begin tran
update table with (serializable) set select * from xml_param
where key = @key
if @@rowcount = 0
begin
insert table (key, ...) values (@key,..)
end
commit tran
Bir sonraki alternatif, kapsamlı bir IF EXISTS veya aşağıdaki formdaki varyasyonlarından birini kullanmaktır. Ancak, bunu optimalin altında bir verimlilik olması nedeniyle reddediyorum:
IF (SELECT COUNT ... ) > 0
UPDATE
ELSE
INSERT
Sonraki seçenek, burada açıklandığı gibi Birleştirme ifadesini kullanıyordu: http://www.databasejournal.com/features/mssql/using-the-merge-statement-to-perform-an-upsert.html . Ancak, Birleştirme sorgusu ile ilgili sorunları burada okudum: http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/ . Bu nedenle Birleştirmeden kaçınmaya çalışıyorum.
Yani, şimdi sorum şu: SQL Server 2008 saklı yordamda XML parametresini kullanarak birden fazla upsert elde etmek için başka bir seçenek veya daha iyi bir yolu var mı?
XML parametresindeki verilerin, geçerli kayıttan daha eski olması nedeniyle UPSERTed olmaması gereken bazı kayıtlar içerebileceğini lütfen unutmayın. ModifiedDate
Kaydın güncellenmesi veya atılması gerekip gerekmediğini belirlemek için hem XML hem de hedef tabloda karşılaştırılması gereken bir alan vardır .
MERGE
Bertrand'ın işaret ettiği konular çoğunlukla tıpaları göstermemek gibi son durum ve verimsizliklerdir - MS, gerçek bir mayın tarlası olsaydı serbest bırakmazdı. Kaçınılması gereken kıvrımların kaydettiklerinden MERGE
daha fazla potansiyel hata yaratmadığından emin misiniz ?
MERGE
. MERGE'nin INSERT ve UPDATE adımları hala ayrı olarak işlenir. Yaklaşımımdaki temel fark, güncellenmiş kayıt kimliklerini tutan tablo değişkeni ve bu kayıtları gelen verilerin geçici tablosundan kaldırmak için bu tablo değişkenini kullanan DELETE sorgusudur. Ve KAYNAK geçici bir tabloya damping yerine doğrudan @ XMLparam.nodes () olabilir, ama yine de, bu kendinizi bu uç durumlardan birinde kendinizi bulmak konusunda endişelenmenize gerek yok; ).