INSERT INTO bei lokaler Quelltabelle

18/03/2008 - 20:10 von Kurt Langeder | Report spam
Hallo NG!

Ich habe eine lokale Access-Tabelle (Tabellenname: accTabelle) und
eine Tabelle am SQL-Server (Tabellenname: sqlTabelle), die über einen
ODBC-Link in die lokale Datenbank eingebunden ist. Beide Tabellen
haben die gleiche Struktur.

Das erste Feld in der Tabelle ist der Primàrschlüssel. Feld "ID" mit
AutoWert, Long Integer, Inkrement.

Ich möchte nun Datensàtze von der lokalen Access-Tabelle in die
SQL-Tabelle einfügen, wobei aber der Primàrschlüssel-Wert in der
Zieltabelle nicht veràndert werden darf.

Der entsprechende PassThrough-Code sieht etwa wie folgt aus:

Dim db As Database, qdf As QueryDef
Set db = CurrentDb
Set qdf = db.CreateQueryDef("")
qdf.Connect "ODBC;DRIVER={SQL
Server};SERVER=myServer;DATABASE=myDB;UID=abc;PWD=abc"

qdf.SQL = "SET IDENTITY_INSERT sqlTabelle ON"
qdf.Execute

qdf.SQL = "INSERT INTO sqlTabelle(ID, Feld1, Feld2) SELECT * FROM
accTabelle"
qdf.Execute

qdf.SQL = "SET IDENTITY_INSERT sqlTabelle OFF"
qdf.Execute


Das qdf.Execute für das "INSERT INTO"-Statement liefert jedoch
folgenden Fehler:
[Microsoft][ODBC SQL Server Driver][SQL Server]Ungültiger Objektname
'accTabelle'.
ODBC-Aufruf fehlgeschlagen.


Die ODBC-Verbindung funktioniert und auch der Code für die
PassThrough-Abfrage ist OK. Es funktioniert z.B. das "INSERT INTO
"-Statement, wenn die Datensàtze von einer SQL-Tabelle in eine andere
SQL-Tabelle (beide haben wieder die selbe Tabellenstruktur) kopiert
werden. Auch die Primàrschlüssel bleiben dabei aufgrund des Befehles
"SET IDENTITY_INSERT" erhalten.

Auch funktioniert das Einfügen in die SQL-Tabelle, wenn die Werte
direkt eingefügt werden, z.B.
qdf.SQL = "INSERT INTO sqlTabelle(ID, Feld1, Feld2) VALUES (4,
'FeldWert1', 'FeldWert2')"


Wie es also scheint, kann die PassThrough-Abfrage nicht auf die lokale
Tabelle zugreifen. Wie schaffe ich es aber, dass die Datensàtze der
lokalen Tabelle in die SQL-Tabelle eingefügt werden und dabei die
Primàrschlüssel erhalten bleiben.


Umgebung: Access97 (SR-2), SQL-Server2005 (SP 1)

Danke und Schöne Grüße
Kurt
 

Lesen sie die antworten

#1 Stefan Dase
18/03/2008 - 21:01 | Warnen spam
Hallo Kurt!

Der entsprechende PassThrough-Code sieht etwa wie folgt aus:

Dim db As Database, qdf As QueryDef
Set db = CurrentDb
Set qdf = db.CreateQueryDef("")
qdf.Connect > "ODBC;DRIVER={SQL
Server};SERVER=myServer;DATABASE=myDB;UID=abc;PWD=abc"

qdf.SQL = "SET IDENTITY_INSERT sqlTabelle ON"
qdf.Execute

qdf.SQL = "INSERT INTO sqlTabelle(ID, Feld1, Feld2) SELECT * FROM
accTabelle"
qdf.Execute

qdf.SQL = "SET IDENTITY_INSERT sqlTabelle OFF"
qdf.Execute



Wie du schon bemerkt hast, kannst du lokale Tabellen in einer
Pass-Through-Abfrage (PT) nicht verwenden. Das macht auch Sinn, denn du
sagst mit dem PT ja explizit, dass du direkt auf dem Server arbeiten
möchtest. Mit obigem Konstrukt könntest du die Daten in einer Schleife
jeweils Satzweise übertragen.

Ansonsten teste doch mal, ob das IDENTITY_INSERT auch noch gültig ist,
wenn du direkt aus Access heraus die Daten mit einer zweiten Abfrage
übertràgst:

INSERT INTO sqlTabelle
SELECT * FROM accTabelle

HTH,
Stefan

Ähnliche fragen