2012-03-30 20 views
5

Bir TempTable içine kayıt eklemek istiyorum. Böyle bir şey: "insert into" uzun zaman alır, böyleceSELECT INTO SELECT - büyük miktarda kayıt

insert into ##tempT 
SELECT * FROM MyTable 

MyTable kayıtlarının büyük miktarda içerir. Ben çalıştırmayı denerseniz

: o "Tablom" tüm kayıtların kadar hep "0" döndürür

SELECT COUNT(*) FROM ##tempT 

komutu INSERT INTO tarafından sokulur.

## tempT'de kaç tane kayıt olduğunu gösteren bir ilerleme sayısı nasıl edinebilirim?

SQL komutu çalışırken bir ilerleme çubuğu değerini güncellemem gerekiyor.

Teşekkür ederiz.

+0

meraktan niçin geçici bir tabloya veri eklersiniz? – Baz1nga

cevap

8

set transaction isolation level read uncommitted 
SELECT COUNT(*) FROM ##tempT 
+5

İyi nokta, ya da daha iyisi: 'bağlantı durumunu etkilemekten kaçınmak için ## TempT with (nolock)' arasından seçim yapın (*). – Ben

+0

Her ikisi de 'uncommited' ve 'nolock' senaryolarınızda çalışacaktır. Ancak, ikisi de tehlikeli silahlardır, bu yüzden onları senaryoları manipüle eden verilerde kullanmaktan kaçının (bir ilerleme çubuğu tamam). – SWeko

+0

havalı, daha da iyisi :) – Diego

1

Sen sorgu yukarı ayırabilirsiniz deneyin.

x = number of records in MyTable/100 
i = 0 

do until we're done 
    queryString = "insert into ##tempT " 
    queryString += "select top " + x " + " * FROM MyTable " 
    queryString += "where RecordNumber > " + i 

    Execute queryString 
    Update Progress Bar 
    i = i + x 
loop 

Bu işi yapmak için bir çeşit RecordNumber alanına ihtiyacınız olduğunu göreceksiniz. Arayabileceğin çeşitli yollar vardır.

+0

Ben'in çözümü (Diego'nun cevabı hakkında yorum) muhtemelen sizin senaryo için en iyisidir. Tek bir iş parçacığıyla sınırlandığınızda ve iş parçacığı DB güncelleştirmesini ve GUI geri bildirimini genellikle vb6 günlerde yaptığımız gibi yaptığınızda, çözümüm çok daha iyi. –

+2

Bu, bugün standartlar için korkunç bir çözümdür. – JotaBe

+0

@JotaBe Peki şimdi sadece hislerimi acıtıyor. Üzgünüm cevabım seni memnun etmedi. –

1

Kayıtlı bir yordam kullanın ve bir COUNT değişkeni DECLARE uygulayın ve bunu bir döngü değişkeni olarak ele alın ve her ekleme işlemi bittiğinde COUNT değerini 1 artırın ve sayımı öğrenmek istediğinizde başka bir sorgu kullanarak yazdırmaya devam edin. Bu prosedürden sayılır ve ilerleme çubuğunu güncellemek için programınıza okuyun.

+0

Ayrıca, bir sıraya kayıt tutmaya devam edebilirsiniz ve daha sonra, hemen TempTable içinde güncellemeye gerek duymazsanız, DB tablosuna bir işlem olarak itebilirsiniz. Performansı artırabilir ve çevrimdışı da yapılabilir. – Milee

+0

ek, bir toplu işte gerçekleştiriliyor. Bu çözüm işe yaramaz – Diego

+0

Bir tablo değil sıraya ekleme ile ilgili. – Milee