Abrufen der nächsten ID ohne Einfügen einer Zeile

8

Ist es in SQL (SQL Server) möglich, die nächste ID (Ganzzahl) aus einer Identitätsspalte in einer Tabelle vor und ohne eine Zeile einzufügen? Dies ist nicht unbedingt die höchste ID plus 1, wenn die letzte Zeile gelöscht wurde.

Ich frage das, weil wir gelegentlich eine Live-DB mit neuen Zeilen aktualisieren müssen. Die ID der Zeile wird in unserem Code verwendet (zB Switch (ID) {Case ID:} und muss identisch sein. Wenn unsere Entwicklungs-DB und Live-DB nicht synchron sind, wäre es schön, vorher eine Zeilen-ID vorherzusagen vor der Bereitstellung.

Ich könnte natürlich IDENTITY OFF SET INSERT_IDENTITY ON setzen oder eine Transaktion ausführen (führt dies einen Rollback der ID aus?) usw. Aber ich frage mich, ob es eine Funktion gibt, die die nächste ID zurückgibt (ohne sie zu erhöhen) ).

    
iWeasel 09.10.2009, 09:52
quelle

5 Antworten

9

Bearbeiten:

Nachdem ich einige Stunden damit verbracht habe, ganze Seiten-Dumps zu vergleichen, wurde mir klar, dass es einen einfacheren Weg gibt und ich sollte auf den DMVs bleiben.

Der Wert überlebt eine Sicherung / Wiederherstellung, was ein eindeutiger Hinweis darauf ist, dass er gespeichert wird. Ich habe alle Seiten in der Datenbank gelöscht und konnte den Standort / die Änderung für den Zeitpunkt nicht finden Ein Datensatz wurde hinzugefügt. Vergleiche 200k Zeilen Dumps von Seiten macht keinen Spaß.

Ich hatte die dedizierte Admin-Konsole verwendet Ich habe einen Speicherauszug jeder einzelnen internen Tabelle ausgesetzt eine Zeile eingefügt und dann einen weiteren Speicherauszug der Systemtabellen genommen. Beide Dumps waren identisch, was darauf hinweist, dass, während es überlebt hat und daher gespeichert werden muss, es selbst auf dieser Ebene nicht exponiert ist.

Nachdem ich im Kreis herumgegangen bin, habe ich gemerkt, dass die DMV die Antwort hatte.

%Vor%

Nur weil die Zeilen entfernt wurden, wurde der letzte Wert nicht zurückgesetzt, daher sollte der letzte Wert + Inkrement die richtige Antwort sein.

Ich werde auch die Episode in meinem Blog aufschreiben.

Oh, und die Abkürzung zu allem:

%Vor%

Es stellt sich also heraus, dass es einfach ist - aber das alles geht davon aus, dass niemand anders Ihre ID benutzt hat, während Sie es zurückbekommen haben. Gut für die Untersuchung, aber ich würde es nicht im Code verwenden wollen.

    
Andrew 09.10.2009, 11:37
quelle
8

versuchen Sie IDENT_CURRENT :

%Vor%

Dies funktioniert auch, wenn Sie in der aktuellen Sitzung keine Zeilen eingefügt haben:

  

Gibt den letzten Identitätswert zurück, der für eine angegebene Tabelle oder Sicht generiert wurde. Der letzte erzeugte Identitätswert kann für jede Sitzung und jeden Bereich gelten.

    
Himadri 09.10.2009 11:16
quelle
2

Anstatt eine IDENTITY-Spalte zu verwenden, könnten Sie eine UNIQUEIDENTIFIER (Guid) -Spalte als eindeutige Zeilenkennung verwenden und bekannte Werte einfügen.

Die andere Option (die ich verwende) ist SET IDENTITY_INSERT ON, wobei die Zeilen-IDs in einem source-gesteuerten einzelnen 'Dokument' verwaltet werden.

    
Mitch Wheat 09.10.2009 10:00
quelle
2

Sie können ziemlich einfach feststellen, dass der zuletzt verwendete Wert ist:

%Vor%

Normalerweise ist die nächste ID last_value + 1 - aber dafür gibt es keine Garantie.

Marc

    
marc_s 09.10.2009 10:18
quelle
2

Das ist ein bisschen seltsam, aber es wird funktionieren:

Wenn Sie den nächsten Wert wissen möchten, beginnen Sie mit dem größten Wert plus eins:

%Vor%

Damit dies funktioniert, müssen Sie die Identität beim Einfügen zurücksetzen:

%Vor%

Nicht gerade eine elegante Lösung, aber ich hatte meinen Kaffee noch nicht; -)

(Dies setzt auch voraus, dass nichts in der Tabelle von Ihrem Prozess oder einem anderen Prozess zwischen dem ersten und zweiten Codeblock ausgeführt wird).

    
Jeff Hornby 09.10.2009 11:02
quelle

Tags und Links