Gibt Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64)
es eine Möglichkeit zu sehen, welchen Mechanismus SQL Server verwendet, um die neuen Identitätswerte für Tabellen zu berechnen, die von erstellt wurden SELECT INTO
?
BEISPIELDATEN
-- Create our base table
CREATE TABLE dbo.A
(A_ID INT IDENTITY(1, 1),
x1 INT,
noise1 int DEFAULT 1,
noise2 char(1) DEFAULT 'S',
noise3 date DEFAULT GETUTCDATE(),
noise4 bit DEFAULT 0);
-- Create random data between the range of [0-3]
INSERT INTO dbo.A(x1)
SELECT s1000.n FROM
( SELECT TOP (10) n = 1 FROM sys.columns) AS s10 -- 10
CROSS JOIN
( SELECT TOP (10) n = 1 FROM sys.columns) AS s100 -- 10 * 10
CROSS JOIN
( SELECT TOP (10) n = ABS(CHECKSUM(NEWID())) % 4 FROM sys.columns) AS s1000; -- 100 * 10
SELECT * FROM dbo.A ORDER BY A_ID DESC;
In meinem Fall sind die Ergebnisse:
Und läuft
DBCC CHECKIDENT('A')
kehrt zurück
Identitätsinformationen prüfen: aktueller Identitätswert '1000', aktueller Spaltenwert '1000'.
Neue Tabelle erstellen
Wenn wir eine Teilmenge in einer neuen Tabelle auswählen, wird ein neuer aktueller Identitätswert erstellt:
SELECT * INTO #temp FROM dbo.A WHERE x1 = 0;
Der höchste Wert in der Identitätsspalte dieser neuen Tabelle ist 998, und wenn wir die nächste Identität überprüfen:
DBCC CHECKIDENT('#temp')
Identitätsinformationen prüfen: aktueller Identitätswert '998', aktueller Spaltenwert '998'.
Wie?
Wie werden diese Identitätswerte in die neue Tabelle eingefügt, wobei der höchste Wert korrekt als aktueller Identitätswert der neuen Tabelle festgelegt wird?