was tut SetIdentity?

01/04/2008 - 12:44 von Katharina | Report spam
Hallo Kurt,
vielen Dank für Deine schnelle Antwort, hab die Funktion erstmal Kurt()
genannt ;)

Trotzdem komme ich nicht weiter, Drag & Drop klappt, per SQL anfügen kommt
immer noch Schlüsselfehler.
Kannst du mir sagen was bei der Funktion SQL_SetIdentity() im SQL-Server
passiert?

Ich hatte gedacht, das sich beim PK unter Identitàtspezifikation die
Einstellungen àndern würden, da tut sich aber nichts.
Auch nicht nach Aktualisieren - also liege ich da vermutlich falsch.

Vielen Dank für weitere Hilfe und Gruß

Katharina


Von: "Kurt Langeder" <anonymous@discussions.microsoft.com>
Betreff: Re: Kopieren/Einfügen reagiert anders als Anfügeabfrage
Datum: Montag, 31. Màrz 2008 17:20

Hallo Katharina

"Katharina" <Dierking.K@t-online.de> schrieb:

muss Daten aus ca. 70 Access-Tabellen per Code in den SQL-Server


konvertieren.


Vor ca. 2 Wochen gab es die Anfrage 'INSERT INTO bei Lokaler
uelltabelle' - das ist sicherlich ein àhnliches Problem, aber meine
Versuche dem SQL-Server SET 'IDENTITY_INSERT sqlTabelle OFF' von


Access aus

beizubringen sind klàglich gescheitert.



Bei mir hat der Tipp mit dem Setzen des SET IDENTITY_INSERT in einer
Pass-Through-Abfrage funktioniert. Hier mein Code dazu:

' hier der Access-Code zum Übertragen der Daten von einer lokalen
Accesstabelle ("accTabelle") an eine SQL-Tabeel ("sqlTabelle). Vorher
und nachher das IDENTITY_INSERT setzen.

X = SQL_SetIdentity("sqlTabelle", "ON")
DoCmd.RunSQL "INSERT INTO sqlTabelle SELECT * accTabelle"
X = SQL_SetIdentity("sqlTabelle", "OFF")



' Funktion für IDENTITY_INSERT-Setzen
Function SQL_SetIdentity(SetIdentityTab, SetOnOff) As Boolean
On Error Resume Next
Dim db As Database, qdf As QueryDef, aktError As Long
Set db = CurrentDb
Set qdf = db.CreateQueryDef("")
qdf.Connect = xxxx ' hier dein Connection-String für die
Verbindung zum SQL-Server
qdf.ReturnsRecords = False
qdf.SQL = "SET IDENTITY_INSERT " & SetIdentityTab & " " & SetOnOff
On Error GoTo Error_Exit_PT
qdf.Execute
Exit_PT:
qdf.Close: db.Close
SQL_SetIdentity = (aktError = 0)
Exit Function
Error_Exit_PT:
aktError = Err.Number
Resume Exit_PT
End Function

Hoffe das hilft auch dir weiter - bei mir hat's damit funktioniert.

Schöne Grüße
Kurt
 

Lesen sie die antworten

#1 Kurt Langeder
01/04/2008 - 14:19 | Warnen spam
Hallo Katharina!

Meine Erfahrungen mit dem SQL-Server sind derzeit auch noch sehr
bescheiden, ich bin auch erst seit einigen Wochen dabei mich nàher mit
dem SQL-Server zu befassen und mein Backend von einer Access-MDB auf
eine SQL-Tabelle umzustellen und so "lerne" ich auch tàgliche neue
Dinge, die früher unter Access einfach funktioniert haben, aber jetzt
unter SQL-Server nicht mehr so gehen.

"Katharina" schrieb:
Trotzdem komme ich nicht weiter, Drag & Drop klappt, per SQL anfügen


kommt
immer noch Schlüsselfehler.
Kannst du mir sagen was bei der Funktion SQL_SetIdentity() im


SQL-Server
passiert?



In der SQL-Server 2005-Hilfe steht dazu folgendes:
Zitat/Beginn

SET IDENTITY_INSERT (Transact-SQL)

Syntax
SET IDENTITY_INSERT [ database_name . [ schema_name ] . ] table { ON |
OFF }

Hinweise
Die IDENTITY_INSERT-Eigenschaft kann in einer Sitzung zu jedem
Zeitpunkt nur für eine einzige Tabelle auf ON festgelegt sein. Wenn
diese Eigenschaft bereits für eine Tabelle auf ON festgelegt ist und
eine SET IDENTITY_INSERT ON-Anweisung für eine andere Tabelle
ausgegeben wird, gibt SQL Server 2005 eine Fehlermeldung zurück, die
besagt, dass SET IDENTITY_INSERT bereits den Wert ON hat, und die
angibt, für welche Tabelle der Wert ON festgelegt ist.

Wenn der eingefügte Wert größer als der aktuelle Identitàtswert für
die Tabelle ist, verwendet SQL Server automatisch den neu eingefügten
Wert als aktuellen Identitàtswert.

Die Einstellung von SET IDENTITY_INSERT wird zur Ausführungszeit und
nicht zur Analysezeit festgelegt.
Zitat/Ende

D.h. wenn dein Primàrschlüssel in der Access-Tabelle den Wert 100
hatte und dann das SET IDENTITY_INSERT für diese Tabelle am SQL-Server
auf ON gestellt wird, bleibt dann beim Einfügen über das
DoCmd.RunSQL-Statement der AutoWert in der SQL-Tabelle ebenfalls auf
100.

Da das SET IDENTITY_INSERT immer nur für eine einzelne Tabelle gesetzt
werden kann, musst du also immer zuerst das SQL_SetIdentity() auf ON
stellen, dann das DoCmd.RunSQL-Statement ausführen, und dann wieder
SQL_SetIdentity() auf OFF stellen, dann die nàchste Tabelle, usw...

Prüfe auch mal im SQL Server Profiler, was dort aufgezeichnet wird,
wenn du deine SQL_SetIdentity() und DoCmd.RunSQL-Statements ausführst.

Mir ist aber aufgefallen, dass das SET IDENTITY_INSERT auch nicht
immer funktioniert. Das war aber dann meist immer so, dass ich auch
noch die entsprechende gelinkte SQL-Tabelle zu Testzwecken offen
hatte. Schließe also vorher immer die betroffene eingebundene
SQL-Tabelle. ... und wenn das SET IDENTITY_INSERT einmal nicht ging,
habe ich dann immer die eingebundene SQL-Tabelle gelöscht und neu
eingebunden - dann hat's sicher immer funktioniert.

Ich habe auch einen Artikel im Internet gefunden, der besagt, dass das
SET IDENTITY_INSERT manchmal nicht funktionert. Hier wurde dann
empfohlen zu prüfen, ob sich vielleicht die Connection zum SQL-Server
geàndert hat. Das kannst du aber auch im SQL Server Profiler
nachschauen, wer gerade mit den Tabellen arbeitet.

Zudem gibt's einen FIX für den SQL-Server, der auf einen Bug hinweist:
KB-Artikel 949097

FIX: Error message when you insert a new row into a view in SQL Server
2005: "Cannot insert explicit value for identity column in table
<TableName> when IDENTITY_INSERT is set to OFF"

Ich hatte gedacht, das sich beim PK unter Identitàtspezifikation die
Einstellungen àndern würden, da tut sich aber nichts.
Auch nicht nach Aktualisieren - also liege ich da vermutlich falsch.



Keine Ahnung was du da meinst, aber der PK darf sich doch nicht
àndern, wenn du die Daten von der lokalen Access-Tabelle auf den
SQL-Server übertràgst, sonst stimmen doch die entsprechenden
Fremdschlüssel nicht mehr.

Viel Erfolg
Kurt

Ähnliche fragen