funktion oder methode um stückweises lesen zu ermöglichen
-
hy
ich lese per ado aus einer ms sql datenbank.
nun möchte ich es folgendermassen haben:
ich lese am anfang alle datensätze aus einer tabelle aus, also:
ADOQuery1->SQL->Text = "SELECT * FROM personen";
nun möchte ich von diesen sagen wir mal 10'000 datensätze immer 10 zur verfügung haben, dann diese verarbeiten und dann die nächtsten 10 usw.weiss jemand ob man dies mit ADO realisieren kann, oder muss ich die sql statemetns entsprechend definieren, dass es mir immer nur 10 ausliest?

freundliche grüsse und ein dankeschön.
trade
-
Hallo
für MySQL gibt es dafür das Schlüsselworet Limit, um die Menge einer Abfrage einzuschränken :
SELECT * FROM personen LIMIT 0,10 // Auswahl der ersten 10 Datensätze ... SELECT * FROM personen LIMIT 10,10 // Auswahl der nächsten 10 Datensätze ...bis bald
akari
-
ms sql kennt leider kein limit!!
das ist mySQL, bei welchem dieser befehl funktioniert!!
-
Hallo
dann solltest du dir mal die MS SQL Doku durchlesen. Hier bist du jedenfalls falsch. (Wenn es nicht bei der ADO-Komponente eine Eigenschaft gibt, um das einzustellen. Dann sollte es aber auch ein MS SQL-Schlüsselwort geben)
bis bald
akari
-
Diese Vorgehensweise macht m.E. nicht viel Sinn.
Du kannst so nicht sicher stellen, dass ein Anwender zwischenzeitlich keinen DS einfügt, ändert oder löscht. Ergo würde Deine Routine versuchen, DS zu ändern, die schon geändert sind, oder DS auslassen, die noch zu ändern gewesen wären. Das kann in einem wunderschönen Datenchaos enden...
-
das ist nicht nötig!!das programm liest datensätze aus, datensätze ändern oder löschen ist nicht möglicht.
mein problem liegt darin, dass ich daten vom ms sql server auf eine adere datenbank transferieren muss.
ich habe es bisher so gemacht, dass es alle datensätze ausliest, in einen zweidimensionalen array schreib und schliesslich die insert-statements mit den daten aus dem array erzeugt.
da sich aber nun bis zu einere million datensätze in der tabelle befinden, wird das ein bisschen schwierig, all diese daten in einenn array zu packen. das ziel wäre es nun, immer nur 10 oder 50 datensätze auszulesen, diese in der array zu schreiben und dann die insert statements generieren und abschicken.gruss trade
-
trade,
der zu MySQL's LIMIT passende TSQL-Befehlt lautet TOP - z.B.:
SELECT * TOP 10 FROM ...
... falls die Einwände von Joe_M für Dich nicht relevant sein sollten.
-
Den Zwischenschritt mit dem Array kannst Du doch getrost einsparen?!? Wozu machst Du nicht direkt einen Insert in die Zieltabelle?
-
mit top kann man doch nur die anzahl der obersten datensätze angeben, welche ausgelesen werden. also wenn ich sage "select * top 10 from balabla" dann gibt es mir die obersten 10 datensätze aus. beim limit aber kann man aber noch sagen von welchem datensatz an es soll die nächtsten 10 nehmen. limit 11,10 liest mir doch vom elften datensatz an 10 datensätze aus.
wie funktioniert das mit top, wenn man z.b vom 21 datensatz an 20 datensätze auslesen will?

gruss
-
trade schrieb:
... wie funktioniert das mit top, wenn man z.b vom 21 datensatz an 20 datensätze auslesen will?...
gar nicht. Das mußt Du selbst anhand irgend einer Sortier-Reihenfolge und mit Hilfe eines Primärschlüssels selbst implementieren - unangenehm und kostet viel Prozessorlast auf dem Server, da die Sortierung natürlich immer über alle Datensätze der betreffenden Tabelle geht. Der neue MS-SQL-Server (Yukon) soll "Paging" wohl unterstützen, habe ich irgendwo gelesen.
Edit:
Alternative 1: die Menge aller Primärschlüssel in einen lokalen Puffer laden und diese dann Block-weise verarbeiten - auch nicht gerade schön.
Alternative 2: Server-seitige CURSOR verwenden - kostet viel Traffic und Prozessorlast auf dem Server
Alternative 3: über Alternativen nachdenken, da Paging prinzipiell an der Idee der Server-gestützten Datenbanken vorbei geht
-
Die Thematik in diesem Beitrag kommt mir so merkwürdig bekannt vor.
Wenn Du tatsächlich alle Datensätze in irgendeiner Form bearbeiten willst, solltest Du Dir wirklich überlegen,
ob Du das nicht datenbankseitig erledigen kannst, z.B. mit einer Stored Procedure.
Vielleicht solltest Du auch einfach mal konkreter werden. Vielleicht gibt es ja für Dein Problem auch
irgendeinen völlig anderen Lösungsweg als den, in den Du Dich gegenwärtig "verrannt" hast.Gruß,
Alexander
-
@Jan und Alexander:
