Discussion:
Mit Anfügeabfrage nur neue Datensätze übernehmen
(zu alt für eine Antwort)
Veronika Neufeind
2005-05-10 15:22:02 UTC
Permalink
Hallo allerseits,

ich muss mich nochmals mit einem Problem an das Forum wenden. Mit der INSERT
INTO-Anweisung (von Elmar) übertrage ich Daten aus einer Access-DB in eine
SQL-DB.

INSERT INTO SQLTabelle (ArtikelID, Name1)
IN '' [ODBC;DRIVER={SQL
SERVER};SERVER=ELMARB;DATABASE=TEMPDB;Trusted_Connection=Yes]
SELECT ArtikelID, Name1 FROM Artikel


Wie kann ich es denn erreichen, dass nur die seit der letzten Übertragung
neu hinzugekommenen Datensätze mit jedem neuen Abfrageaufruf übertragen
werden?
Die Access-Tabelle hat eine AutoWert-ID.

Wenn mir jemand weiterhelfen könnte, wäre das sehr schön. Danke.

Gruß Veronika
Dieter Strassner
2005-05-10 16:44:41 UTC
Permalink
Hallo Veronika,
Post by Veronika Neufeind
Wie kann ich es denn erreichen, dass nur die seit der letzten Übertragung
neu hinzugekommenen Datensätze mit jedem neuen Abfrageaufruf übertragen
werden?
Die Access-Tabelle hat eine AutoWert-ID.
mit jedem Lauf mußt Du Dir die höchte Access-Auto-ID merken. Bei jedem
erneuten INSERT kommt die dies gemerkte ACCESS-AUto-ID als WHERE-Kriterium
dazu. Dann kann der INSERT nur "neue" records erwischen und einfügen. Das
speichern kann ja über eine extra "mini"-Tabelle in ACCESS erfolgen. Von
dort wird die ID auch wieder für das WHERE-Kriterium abgeholt.
--
Viele Grüße

Dieter


Rückfragen bitte nur in die Newsgroup!

EDV-Kommunikation Strassner e.K.
68623 Lampertheim
Internet: www.strassner.biz
Veronika Neufeind
2005-05-10 17:10:03 UTC
Permalink
Hallo Dieter,

danke für deine Antwort. Das klingt alles sehr logisch, aber hast du
vielleicht mal ein Code-Beispiel dafür? So werde ich nicht damit zurecht
kommen.

Vielen Dank nochmals.

Gruß Veronika
Dieter Strassner
2005-05-10 17:53:41 UTC
Permalink
Hallo Veronika,
Post by Veronika Neufeind
danke für deine Antwort. Das klingt alles sehr logisch, aber hast du
vielleicht mal ein Code-Beispiel dafür? So werde ich nicht damit zurecht
kommen.
ein komplettes fertiges Beispiel kann ich aus Zeitgründen und fehlenden
Detailkenntnissen nicht erstellen und testen, sorry.

Etwas genauer geht es aber schon:

1.Definiere in ACCES eine neue Tabelle (IDTable mit einem einzigen Feld,
entsprechend dem Datentyp der Auto-ID der Tabelle "Artikel" aus ACCESS)

2. lege einen Datensatz an mit der ID=0 (:= z.Zt. höchste bereits nach SQL
übernommene ID)

3.Erweitere den INSERTINTO um dei WHERE-Klausel. ungefähr so:

INSERT INTO SQLTabelle (ArtikelID, Name1)
IN '' [ODBC;DRIVER={SQL
SERVER};SERVER=ELMARB;DATABASE=TEMPDB;Trusted_Connection=Yes]
SELECT ArtikelID, Name1 FROM Artikel WHERE Artikel.id>(SELECT max(ID) FROM
IDtable)

4. Anschliessend einen UPDATE auf die IDtable in ACCESS:
UPDATE IDtable SET ID=(SELECT max(artikel.id) FROM Artikel)

5. Das ganze in eine Transaction packen. Wie sich ACCES dabei verhält:Keine
Ahnung.
Es könnte ja sein, da zwischen INSERT und UPDATE noch ein Satz durch einen
anderen User in ACCESS dazu kommt, dann würde in IDtable.ID ein zu hoher
Wert stehen. Dieser "zwischengerutschte" Satz würde dann nicht übernommen
werden!

6. Insert + UPDATE in ein Command packen und gemeinsam ausführen.

HTH!
--
Viele Grüße

Dieter


Rückfragen bitte nur in die Newsgroup!

EDV-Kommunikation Strassner e.K.
68623 Lampertheim
Internet: www.strassner.biz
Elmar Boye
2005-05-10 17:53:20 UTC
Permalink
Hallo Veronika,
Post by Veronika Neufeind
danke für deine Antwort. Das klingt alles sehr logisch, aber hast du
vielleicht mal ein Code-Beispiel dafür? So werde ich nicht damit
zurecht kommen.
ergänze das um
SELECT ... FROM Artikel
WHERE ArtikelID > (SELECT MaxID FROM ArtikelIDMerkTabelle)

Wobei ArtikelMerkTabelle eine beliebige Tabelle in der Jet Datenbank
ist, in der Du den letzten Wert reinschreibst.

Theoretisch geht auch ein
WHERE ArtikelID > (SELECT MAX(ArtikelID)
FROM SQLTabelle IN '' [ODBC;DRIVER={SQL
SERVER};SERVER=ELMARB;DATABASE=TEMPDB;Trusted_Connection=Yes]

Aber man muss es mit den heterogenen Abfragen nicht unbedingt übertreiben.
Vorziehen würde ich dann allerdings die Lösung meiner anderen Antwort.
Gruss
Elmar
Mario Kropik
2005-05-10 18:07:40 UTC
Permalink
Post by Dieter Strassner
dazu. Dann kann der INSERT nur "neue" records erwischen und einfügen. Das
speichern kann ja über eine extra "mini"-Tabelle in ACCESS erfolgen. Von
dort wird die ID auch wieder für das WHERE-Kriterium abgeholt.
Um welche Datenmengen geht es denn? Falls es sich um relativ kleine Anzahl
an Sätzen dreht kannst du auch einen OUTER JOIN zwischen der eingebundenen
SQL Tabelle und der Access Tabelle machen, und die PKs der Datensätze
abfragen, die in der SQL Tabelle nicht enthalten sind ( = NULL)

INSERT INTO SQL_TAB SELECT * FROM ACC_TAB WHERE ACC_TAB.PK IN
(
SELECT ACC_TAB.PK
FROM ACC_TAB LEFT JOIN SQL_TAB ON ACC_TAB.PK = SQL_TAB.PK
WHERE SQL_TAB.PK IS NULL
)

Damit schreibst du alle Sätze in die eingebundene Tabelle, die nicht
enthalten sind. Ist IMHO die beste Lösung solange es nicht um _richtig_
großwe Datenmengen geht...

Gruß
Mario
Elmar Boye
2005-05-10 17:49:48 UTC
Permalink
Hallo Veronika,
Post by Veronika Neufeind
ich muss mich nochmals mit einem Problem an das Forum wenden. Mit der
INSERT INTO-Anweisung (von Elmar) übertrage ich Daten aus einer
Access-DB in eine SQL-DB.
INSERT INTO SQLTabelle (ArtikelID, Name1)
IN '' [ODBC;DRIVER={SQL
SERVER};SERVER=ELMARB;DATABASE=TEMPDB;Trusted_Connection=Yes]
SELECT ArtikelID, Name1 FROM Artikel
Wie kann ich es denn erreichen, dass nur die seit der letzten
Übertragung neu hinzugekommenen Datensätze mit jedem neuen
Abfrageaufruf übertragen werden?
Lass mich unken: Da es über kurz oder lang vermutlich dazu kommt, dass
Du zusätzlich bestehende Daten aktualisieren musst:
Importiere zunächst alle Daten in eine leere Import Tabelle und aktualisiere
erst dann die Tabelle im SQL Server. Die kann notfalls auch in tempdb liegen
und auch Access/Jet SQL kennt SELECT ... INTO.

Gruss
Elmar
Mario Kropik
2005-05-10 18:24:04 UTC
Permalink
Post by Elmar Boye
Lass mich unken: Da es über kurz oder lang vermutlich dazu kommt, dass
das UPDATE für die bestehenden Sätze machst du dann im gleichen Stil wie
mein insert mit join der tabellen nur eben wo pk NOT null...
Am besten dann...
Post by Elmar Boye
Importiere zunächst alle Daten in eine leere Import Tabelle und aktualisiere
erst dann die Tabelle im SQL Server. Die kann notfalls auch in tempdb liegen
und auch Access/Jet SQL kennt SELECT ... INTO.
...mit dieser _sehr_ sinnvollen Ergänzung für das INSERT (und ggf. UPDATE)
der Sätze aus Performancesicht, weil der JOIN dann am Sql Server ausgeführt
wird. Dann kannst meine Einschränkung - relativ kl. Datenmengen - auch gerne
vergessen und die 'ACC_TAB' durch deine Temp Tabelle am Server ersetzen...

Gruß
Mario
Veronika Neufeind
2005-05-11 13:28:02 UTC
Permalink
Hallo zusammen,

leider kann ich erst heute wieder weiter machen. Vielen Dank für rege
Anteilnahme und die tollen Tips. Ich habe mir alles mal angeschaut und ein
wenig experimentiert. Zum Schluß habe ich mich für die Lösung 2 von Elmar
entschieden. Damit frage ich direkt die SQL-Tabelle ab und es geht wirklich
sehr schön.

Also habt alle nochmals vielen Dank.

Gruß Veronika

Loading...