Edit:
Nach einer Anzahl von Stunden zu verbringen ganze Seite Dumps zu vergleichen, erkennen ich, es ein einfacher Weg ist, und ich soll auf dem DMVs bleibt von.
Der Wert überlebt eine Sicherung/Wiederherstellung, die ein klares Anzeichen dafür ist, dass es gespeichert wird - ich habe alle Seiten in der DB entleert und konnte die Position/Änderung für einen Datensatz wurde nicht gefunden. Vergleiche 200k Zeilen Dumps von Seiten macht keinen Spaß.
Ich hatte die dedizierte Admin-Konsole verwendet Ich nahm einen Dump von jeder einzelnen internen Tabelle ausgesetzt eine Zeile eingefügt und nahm dann einen weiteren Dump der Systemtabellen. Beide Dumps waren identisch, was darauf hindeutet, dass, während es überlebt hat und daher gespeichert werden muss, es selbst auf dieser Ebene nicht exponiert ist.
Also nachdem ich in einem Kreis herumgegangen bin, habe ich gemerkt, dass die DMV die Antwort hatte.
create table foo (MyID int identity not null, MyField char(10))
insert into foo values ('test')
go 10
-- Inserted 10 rows
select Convert(varchar(8),increment_value) as IncrementValue,
Convert(varchar(8),last_value) as LastValue
from sys.identity_columns where name ='myid'
-- insert another row
insert into foo values ('test')
-- check the values again
select Convert(varchar(8),increment_value) as IncrementValue,
Convert(varchar(8),last_value) as LastValue
from sys.identity_columns where name ='myid'
-- delete the rows
delete from foo
-- check the DMV again
select Convert(varchar(8),increment_value) as IncrementValue,
Convert(varchar(8),last_value) as LastValue
from sys.identity_columns where name ='myid'
-- value is currently 11 and increment is 1, so the next insert gets 12
insert into foo values ('test')
select * from foo
Result:
MyID MyField
----------- ----------
12 test
(1 row(s) affected)
Nur weil die Zeilen entfernt wurden, wurde der letzte Wert nicht zurückgesetzt, daher sollte der letzte Wert + Inkrement die richtige Antwort sein.
Auch die Episode auf meinem Blog zu schreiben.
Oh, und die Abkürzung, um alles:
select ident_current('foo') + ident_incr('foo')
Also eigentlich stellt sich heraus, einfach zu sein - aber das alles übernimmt niemand sonst Ihre ID verwendet hat, während Sie es zurückbekommen. Gut für die Untersuchung, aber ich würde es nicht im Code verwenden wollen.
Eine Transaktion wird den Identitätszähler nicht zurücksetzen, und es besteht immer das Risiko, dass ein anderer Thread die Nummer verwendet, von der Sie glauben, dass Sie sie später erhalten. – idstam
Danke dafür @idstam Ich habe das vermutet. – iWeasel