Ich versuche, eindeutige Bestellnummern zu generieren, die bei 1 beginnen und um 1 erhöht werden. Ich habe eine PONumber-Tabelle mit diesem Skript erstellt:
CREATE TABLE [dbo].[PONumbers]
(
[PONumberPK] [int] IDENTITY(1,1) NOT NULL,
[NewPONo] [bit] NOT NULL,
[DateInserted] [datetime] NOT NULL DEFAULT GETDATE(),
CONSTRAINT [PONumbersPK] PRIMARY KEY CLUSTERED ([PONumberPK] ASC)
);
Und eine gespeicherte Prozedur, die mit diesem Skript erstellt wurde:
CREATE PROCEDURE [dbo].[GetPONumber]
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1);
SELECT SCOPE_IDENTITY() AS PONumber;
END
Zum Zeitpunkt der Erstellung funktioniert dies einwandfrei. Wenn die gespeicherte Prozedur ausgeführt wird, beginnt sie mit der gewünschten Nummer und wird um 1 erhöht.
Das Seltsame ist, dass, wenn ich meinen Computer ausschalte oder in den Ruhezustand versetze, die Sequenz beim nächsten Ausführen um fast 1000 Sekunden vorgerückt ist.
Siehe Ergebnisse unten:
Sie können sehen, dass die Zahl von 8 auf 1002 gesprungen ist!
- Warum passiert dies?
- Wie stelle ich sicher, dass keine Zahlen übersprungen werden?
- Alles, was ich brauche, ist, dass SQL Zahlen generiert, die:
- a) Garantiert einzigartig.
- b) um den gewünschten Betrag erhöhen.
Ich gebe zu, ich bin kein SQL-Experte. Verstehe ich falsch, was SCOPE_IDENTITY () tut? Sollte ich einen anderen Ansatz verwenden? Ich habe mir Sequenzen in SQL 2012+ angesehen, aber Microsoft gibt an, dass diese standardmäßig nicht eindeutig sind.
quelle
Dies ist ein Problem von SQL Server. Alles, was Sie tun können, ist die Säule neu zu säen.
Löschen Sie die Einträge mit der falschen Spalten-ID. Erneuern Sie die Spaltenidentität. Und dann hat der nächste Eintrag die richtige ID.
Reseed-Identität mit dem folgenden SQL-Befehl:
DBCC CHECKIDENT ('YOUR_TABLE_NAME', RESEED, 9)
- 9 ist die letzte korrekte IDquelle