IDENTITY INSERT mit Cursor

30/09/2007 - 14:14 von Frank Wallwitz | Report spam
Hallo NG,

ich arbeite an einer Prozedur, die Daten aus einer Access-DB in den SQL
Server 2005 übertràgt. Ein Cursor durchlàuft die Tabellen in der Ziel-DB
(SQL Server) und ermittelt u.a., ob es Identitàtsspalten in der aktuellen
Tabelle gibt . Wenn ja, wird ein dynamisches SQL-Statement aufgebaut, das
einen Identity-Insert ermöglichen soll:
.
BEGIN
SELECT @strSQLIDENTITY = 'SET IDENTITY_INSERT dbo.' + @table + ' ON'
EXEC (@strSQLIDENTITY)
END
..

dann folgt der Insert per Ad-hoc Query aus Access und das Identity Insert
der aktuelle Tabelle wird zurückgesetzt

.
BEGIN
SELECT @strSQLIDENTITY = 'SET IDENTITY_INSERT dbo.' + @table + ' OFF'
EXEC (@strSQLIDENTITY)
END
..

Das Statement wird angesprungen und fehlerfrei ausgeführt, allerdings wird
Identity Insert nicht für die Tabelle nicht gesetzt,

ein hardcodiertes:

SET IDENTITY_INSERT dbo.ApplSet ON

an der gleichen Stelle dagegen funktioniert...
Hat jemand eine Idee ?
 

Lesen sie die antworten

#1 Uwe Ricken
30/09/2007 - 15:03 | Warnen spam
Hallo Frank,

grundlegend gilt, dass EXEC immer in einem eigenen Context ausgeführt wird.
Das bedeutet also, dass ein Statement wie folgt nicht funktioniert

EXEC ('SET IDENTITY ...')
INSERT INTO ...

EXEC (SET IDENTITY ... OFF')

Der Grund ist relativ einfach...
Dein "INSERT INTO..." weiss nichts davon, dass Du zuvor ein IDENTITY_INSERT
erlaubt hast - ist ja auch in einem anderen Kontext.

HTH ;-)

Gruß, Uwe Ricken
MCP for SQL Server 2000 Database Implementation

db-Berater GmbH i. G. 64390 Erzhausen
http://www.db-berater.de
http://www.memberadmin.de
http://www.conferenceadmin.de
____________________________________________________
dbdev: http://www.dbdev.org
APP: http://www.AccessProfiPool.de
FAQ: http://www.donkarl.com/AccessFAQ.htm

"Frank Wallwitz" schrieb im Newsbeitrag
news:%
Hallo NG,

ich arbeite an einer Prozedur, die Daten aus einer Access-DB in den SQL
Server 2005 übertràgt. Ein Cursor durchlàuft die Tabellen in der Ziel-DB
(SQL Server) und ermittelt u.a., ob es Identitàtsspalten in der aktuellen
Tabelle gibt . Wenn ja, wird ein dynamisches SQL-Statement aufgebaut, das
einen Identity-Insert ermöglichen soll:
.
BEGIN
SELECT @strSQLIDENTITY = 'SET IDENTITY_INSERT dbo.' + @table + ' ON'
EXEC (@strSQLIDENTITY)
END
..

dann folgt der Insert per Ad-hoc Query aus Access und das Identity Insert
der aktuelle Tabelle wird zurückgesetzt

.
BEGIN
SELECT @strSQLIDENTITY = 'SET IDENTITY_INSERT dbo.' + @table + ' OFF'
EXEC (@strSQLIDENTITY)
END
..

Das Statement wird angesprungen und fehlerfrei ausgeführt, allerdings wird
Identity Insert nicht für die Tabelle nicht gesetzt,

ein hardcodiertes:

SET IDENTITY_INSERT dbo.ApplSet ON

an der gleichen Stelle dagegen funktioniert...
Hat jemand eine Idee ?



Ähnliche fragen