MySQL SQL Server 2005 uygulaması replace into?

oy
73

MySQL bu inanılmaz faydalı henüz properitary sahiptir REPLACE INTOSQL Command.

Bu kolayca SQL Server 2005'te taklit edilebilir mi?

Yeni İşlem başlayan bir yapıyor Select()ve sonra da UPDATEya INSERT IGNORE ve COMMITuygulamada bunu yapıyor ve bu nedenle her zaman ifadenin 2 sürümlerini tutmak, özellikle her zaman bir acı biraz.

Ben kolay ve orada olup olmadığını merak evrensel SQL Server 2005 içine böyle bir işlevi uygulamak için bir yol?

Oluştur 01/08/2008 saat 23:13
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
53

Bu MSSQL (yaklaşık beni rahatsız ediyor şeydir blogumda rant ). Ben MSSQL desteklenen diliyorum upsert.

@ Dillie-O'nun kod eski bir SQL sürümleri (1 oy) içinde iyi bir yoldur, ama yine de temelde iki IO işlemleri (olduğu existsve daha sonra updateya insert)

Üzerinde biraz daha iyi bir yolu var bu yazı temelde:

--try an update
update tablename 
set field1 = 'new value',
    field2 = 'different value',
    ...
where idfield = 7

--insert if failed
if @@rowcount = 0 and @@error = 0
    insert into tablename 
           ( idfield, field1, field2, ... )
    values ( 7, 'value one', 'another value', ... )

bir ekleme eğer bir güncelleme var, ya da iki, bu bir IO işlemleri için azaltır.

MS SQL2008'deki tanıtır mergeSQL: 2003 standardı:

merge tablename as target
using (values ('new value', 'different value'))
    as source (field1, field2)
    on target.idfield = 7
when matched then
    update
    set field1 = source.field1,
        field2 = source.field2,
        ...
when not matched then
    insert ( idfield, field1, field2, ... )
    values ( 7,  source.field1, source.field2, ... )

Şimdi gerçekten sadece bir IO operasyon, ama korkunç kod :-(

Cevap 15/08/2008 saat 13:50
kaynak kullanıcı

oy
20

Aradığınız işlevselliği geleneksel olarak bir UPSERT denir. En azından o size aradığınızı bulmanıza yardımcı olabilecek denen bilerek.

Ben SQL Server 2005 Bunu yapmanın herhangi büyük bir yolu vardır sanmıyorum. : 2008 gösterildiği gibi Bunu gerçekleştirmek için kullanılabilir BIRLEŞTIRME deyimini tanıtır http://www.databasejournal.com/features/mssql/article.php/3739131 veya http://blogs.conchango.com/davidportas/archive/ 2007/11 / 14 / SQL Sunucu-2008-MERGE.aspx

Birleştirme 2005 beta olarak kullanılabilir, ancak son sürümünde dışarı çıkarıldı.

Cevap 01/08/2008 saat 23:22
kaynak kullanıcı

oy
15

Ne Upsert / birleştirme yapıyor etkisiyle şeydir ...

IF EXISTS (SELECT * FROM [Table] WHERE Id = X)
   UPDATE [Table] SET...
ELSE
   INSERT IGNORE  INTO [Table]

Yani umarım bu makaleleri kombinasyonu ve bu sözde kod şeyler hareketli alabilirsiniz.

Cevap 01/08/2008 saat 23:31
kaynak kullanıcı

oy
9

Ben yazdım bu konuda blog yazısı .

Sonuçta ucuz güncellemeleri istiyorsanız olmasıdır ... ve eşzamanlı kullanım için güvenli olmasını istiyoruz. Deneyin:

update t
set hitCount = hitCount + 1
where pk = @id

if @@rowcount < 1 
begin 
   begin tran
      update t with (serializable)
      set hitCount = hitCount + 1
      where pk = @id
      if @@rowcount = 0
      begin
         insert t (pk, hitCount)
         values (@id,1)
      end
   commit tran
end

Bu şekilde 1 güncellemeler için çalışma ve uçlar için 3 operasyonların bir max var. Eğer öyleyse, genellikle bu güncelliyoruz eğer güvenli, ucuz bir seçenektir.

Ayrıca eşzamanlı kullanımı için güvensiz bir şey kullanmamaya çok dikkat olurdu. Birincil anahtar ihlallerini almak ya da üretim satırları çoğaltmak için Onun gerçekten kolay.

Cevap 21/09/2008 saat 23:05
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more