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.