Häufig verwendet man in Tabellen einer Datenbank einen inkrementellen ID-Wert um Datensätze eindeutig zu identifizieren. Möchte man nun diesen ID Wert nach dem INSERT direkt weiterverwenden, drängt sich im ersten Moment die Lösung auf, direkt nach dem INSERT ein SELECT auf die höchste ID abzusetzen und den Wert somit auszulesen.
Verwendet man diese Lösung, läuft man allerdings Gefahr eine falsche ID zu bekommen. Es ist durchaus möglich das zwischen dem INSERT und dem SELECT einer Session, bereits ein weiterer Datensatz einer anderen Session eingefügt wurde.
In diesem Beispiel verwende ich eine Stored Procedure um zwei Datensätze in unterschiedliche Tabellen einzufügen. Die erste Anweisung gibt einen inkrementellen Wert zurück, welcher in der zweiten Anweisung verwendet wird.
CREATE PROCEDURE [sp_Test]
(@name [varchar](300))
AS
SET NOCOUNT ON
INSERT INTO [Tabelle1]([name]) VALUES (@name)
SELECT @@IDENTITY
SET NOCOUNT OFF
INSERT INTO [Tabelle2] (Tabelle1_ID,[name]) VALUES (@@IDENTITY,@name)
GO
Zunächst wird per SET NOCOUNT ON angewiesen, daß die Anzahl der betroffenen Zeilen nicht als Teil des Ergebnis des INSERT INTO zurückgegeben wird. Per INSERT INTO Anweisung wird nun der Datensatz in die erste Tabelle eingefügt. Anschließend wird per SELECT @@IDENTITY der ID-Wert des eingefügten Datensatzes ausgelesen. Die Variable @@IDENTITY enthält immer den zuletzt eingefügten Identitätwert. Nun kann per zweiter INSERT INTO Anweisung der nächste Datensatz eingefügt werden.
Natürlich ist es möglich diese Lösung ohne Stored Procedure zu verwenden, um z.B. die ID direkt im Code weiter zu verwenden.
SET NOCOUNT ON;INSERT INTO [Tabelle1]([name]) VALUES (@name);SELECT @@IDENTITY AS NewID
Die inkrementelle ID wird nun als Feld NewID ausgegeben.