2012-03-30 13 views
5

Ich möchte Datensätze in eine TempTable einfügen. Etwas wie folgt aus:INSERT IN SELECT - große Anzahl von Datensätzen

insert into ##tempT 
SELECT * FROM MyTable 

MyTable enthält eine große Menge an Datensätzen, die die „Einfügen in“ eine lange Zeit in Anspruch nimmt.

Wenn ich zu laufen versuchen:

SELECT COUNT(*) FROM ##tempT 

es immer "0", bis alle Datensätze aus "MyTable" liefert durch INSERT INTO-Befehl eingefügt.

Wie kann ich eine Fortschrittszahl erhalten, die mir rät, wie viele Datensätze in ## tempT sind?

Ich muss einen Fortschrittsbalkenwert aktualisieren, während der SQL-Befehl ausgeführt wird.

Vielen Dank.

+0

aus Neugier, warum würden Sie Daten in eine temporäre Tabelle einfügen? – Baz1nga

Antwort

8

versuchen

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

Guter Punkt oder noch besser: 'Wählen Sie count (*) von ## TempT mit (nolock)', um den Verbindungsstatus nicht zu beeinflussen. – Ben

+0

Sowohl "uncommited" als auch "nolock" werden in Ihrem Szenario funktionieren. Sie sind jedoch beide gefährliche Waffen, also verzichte darauf, sie in Datenmanipulationsszenarien zu verwenden (ein Fortschrittsbalken ist in Ordnung). – SWeko

+0

cool, noch besser :) – Diego

1

Sie Ihre Anfrage nach oben aufspalten.

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 

Sie werden feststellen, dass Sie eine Art RecordNumber-Feld benötigen, um dies zu erreichen. Es gibt verschiedene Möglichkeiten, nach denen Sie suchen können.

+0

Bens Lösung (Kommentar zu Diegos Antwort) ist wahrscheinlich die beste für Ihr spezielles Szenario. Meine Lösung ist viel besser, wenn Sie auf einen einzelnen Thread beschränkt sind und dieser Thread die DB-Aktualisierung und das GUI-Feedback durchführt, wie wir es im Allgemeinen in den vb6-Tagen tun mussten. –

+2

Dies ist eine schreckliche Lösung für heutige Standards. – JotaBe

+0

@JotaBe Nun, das verletzt meine Gefühle. Entschuldigung, meine Antwort gefiel dir nicht. –

1

Verwenden Sie eine gespeicherte Prozedur und DECLARE eine Variable COUNT und behandeln Sie dies als eine Schleife Variable und jedes Mal, wenn eine Einfügung erfolgt, COUNT um 1 erhöhen und drucken Sie es mit einer anderen Abfrage immer wenn Sie die Anzahl wissen möchten. Oder, zurückgeben Zählen Sie aus der Prozedur und lesen Sie es in Ihr Programm, um den Fortschrittsbalken zu aktualisieren. :)

+0

Sie können es auch in einer Warteschlange aufzeichnen und es später als Transaktion in die DB-Tabelle verschieben, wenn Sie es nicht sofort in TempTable aktualisieren müssen. Es kann die Leistung verbessern und kann auch offline ausgeführt werden. – Milee

+0

der Einsatz wird in einer Charge durchgeführt. Diese Lösung wird nicht funktionieren – Diego

+0

Es geht darum, in die Warteschlange keine Tabelle einzufügen. – Milee

Verwandte Themen