Freigeben über


SEQUENZ ERSTELLEN (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric

Erstellt ein Sequenzobjekt und gibt dessen Eigenschaften an. Als Sequenz wird ein benutzerdefiniertes schemagebundenes Objekt bezeichnet, das eine Sequenz numerischer Werte anhand der Spezifikation generiert, mit der die Sequenz erstellt wurde. Die Sequenz numerischer Werte wird in aufsteigender oder absteigender Reihenfolge in einem definierten Intervall generiert und kann so konfiguriert werden, dass sie beim Erreichen des Endes neu gestartet wird (Zyklus).

Sequenzen sind im Gegensatz zu Identitätsspalten nicht bestimmten Tabellen zugeordnet. Anwendungen verweisen auf ein Sequenzobjekt, um dessen nächsten Wert abzurufen. Die Beziehung zwischen Sequenzen und Tabellen wird von der Anwendung gesteuert. Benutzeranwendungen können auf ein Sequenzobjekt verweisen und die Werte in mehreren Zeilen und Tabellen koordinieren.

Im Gegensatz zu Identitätsspaltenwerten, die beim Einfügen von Zeilen generiert werden, kann eine Anwendung die nächste Sequenznummer abrufen, ohne die Zeile durch Aufrufen des NEXT VALUE FOR einzufügen. Mit sp_sequence_get_range können Sie mehrere Sequenznummern gleichzeitig abrufen.

Informationen und Szenarien, die sowohl die Funktion als auch CREATE SEQUENCE die NEXT VALUE FOR Funktion verwenden, finden Sie unter Sequenznummern.

Transact-SQL-Syntaxkonventionen

Syntax

CREATE SEQUENCE [ schema_name . ] sequence_name
    [ AS [ built_in_integer_type | user-defined_integer_type ] ]
    [ START WITH <constant> ]
    [ INCREMENT BY <constant> ]
    [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
    [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
    [ CYCLE | { NO CYCLE } ]
    [ { CACHE [ <constant> ] } | { NO CACHE } ]
    [ ; ]

Argumente

sequence_name

Gibt den eindeutigen Namen der Sequenz in der Datenbank an. Der Typ ist sysname.

[ built_in_integer_type | Benutzer-defined_integer_type ]

Eine Sequenz kann als beliebiger ganzzahliger Typ definiert werden. Die folgenden Typen sind zulässig.

  • tinyint: von 0 bis 255
  • smallint: von –32.768 bis 32.767
  • int: von –2.147.483.648 bis 2.147.483.647
  • bigint: von –9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807
  • decimal und numeric mit einem Bereich von 0.
  • Ein beliebiger benutzerdefinierter Datentyp (Aliastyp), der auf einem der zulässigen Typen basiert.

Wird kein Datentyp bereitgestellt, wird der bigint-Datentyp als Standardtyp verwendet.

START WITH-Konstante <>

Der erste Wert, der vom Sequenzobjekt zurückgegeben wird. Der START Wert muss ein Wert kleiner oder gleich dem Maximum und größer als oder gleich dem Minimalwert des Sequenzobjekts sein. Der Standardstartwert eines neuen Sequenzobjekts ist gleich dem minimalen Wert eines aufsteigenden Sequenzobjekts und dem maximalen Wert eines absteigenden Sequenzobjekts.

INCREMENT BY <Konstante>

Wert, der verwendet wird, um den Wert des Sequenzobjekts für jeden Aufruf der NEXT VALUE FOR Funktion zu erhöhen (oder zu verringern, wenn negativ). Wenn das Inkrement ein negativer Wert ist, ist das Sequenzobjekt absteigend; andernfalls ist sie aufsteigend. Das Inkrement darf nicht 0 sein. Das Standardinkrement für ein neues Sequenzobjekt ist 1.

[ MINVALUE-Konstante <> | KEIN MINWERT ]

Gibt die Grenzen für das Sequenzobjekt an. Der minimale Standardwert eines neuen Sequenzobjekts ist gleich dem minimalen Wert für den Datentyp des Sequenzobjekts. Dieser ist für den tinyint -Datentyp 0 und für alle anderen Datentypen eine negative Zahl.

[ MAXVALUE-Konstante <> | KEIN MAXWERT

Gibt die Grenzen für das Sequenzobjekt an. Der maximale Standardwert eines neuen Sequenzobjekts ist gleich dem maximalen Wert für den Datentyp des Sequenzobjekts.

[ ZYKLUS | KEIN ZYKLUS ]

Eigenschaft, die angibt, ob das Sequenzobjekt vom minimalen Wert (oder bei absteigenden Sequenzobjekten vom maximalen Wert) neu gestartet oder ob eine Ausnahme ausgelöst werden soll, wenn der minimale oder maximale Wert überschritten wird. Die Standardzyklusoption für neue Sequenzobjekte lautet NO CYCLE.

Hinweis

Das Durchlaufen eines SEQUENCE Neustarts vom Minimal- oder Maximalwert und nicht vom Startwert.

[ CACHE <[ Konstante> ] | KEIN CACHE ]

Erhöht die Leistung für Anwendungen, die Sequenzobjekte verwenden, indem die Anzahl der Datenträger-E/As verringert wird, die zum Generieren von Sequenznummern erforderlich sind. Wird standardmäßig auf CACHE festgelegt.

Wenn beispielsweise eine Cachegröße von 50 ausgewählt wird, behält SQL Server keine 50 einzelnen Werte zwischen. Er speichert nur den aktuellen Wert und die Menge der werte, die im Cache verbleiben. Daher ist der zum Speichern des Caches erforderliche Arbeitsspeicher immer doppelt so groß wie zwei Instanzen des Sequenzobjekt-Datentyps.

Hinweis

Wenn die Cacheoption aktiviert ist, ohne eine Cachegröße anzugeben, wählt das Datenbankmodul eine Größe aus. Benutzer sollten sich jedoch nicht darauf verlassen, dass die Auswahl konsistent ist. Microsoft könnte die Methode zur Berechnung der Cachegröße ohne vorherige Ankündigung ändern.

Wenn sie mit der CACHE Option erstellt wurde, kann ein unerwartetes Herunterfahren (z. B. ein Stromausfall) zu einem Verlust von Sequenznummern führen, die im Cache verbleiben.

Bemerkungen

Sequenznummern werden außerhalb des Bereichs der aktuellen Transaktion generiert. Sie werden verbraucht, ob die Transaktion, die die Sequenznummer verwendet, zugesichert oder zurückgesetzt wird. Die doppelte Überprüfung tritt nur auf, wenn ein Datensatz vollständig gefüllt ist. Dies kann in manchen Fällen dazu führen, dass die gleiche Nummer bei der Erstellung für mehr als einen Datensatz verwendet, dann aber als Duplikat identifiziert wird. Wenn dies auftritt und andere automatisch nummerierten Werte auf nachfolgende Datensätze angewendet wurden, kann dies möglicherweise zu einer Lücke zwischen automatisch nummerierten Werten und dem erwarteten Verhalten führen.

Cacheverwaltung

Um die Leistung zu verbessern, weist SQL Server die Anzahl der sequenzierten Zahlen vor, die durch das CACHE Argument angegeben werden.

Beispielsweise wird eine neue Sequenz mit dem Startwert 1 und einer Cachegröße von 15 erstellt. Wenn der erste Wert benötigt wird, werden die Werte 1 bis 15 vom Arbeitsspeicher verfügbar gemacht. Der letzte zwischengespeicherte Wert (15) wird in die Systemtabellen auf dem Datenträger geschrieben. Wenn alle 15 Zahlen verwendet werden, verursacht die nächste Anforderung (für den Wert 16), dass der Cache erneut zugeordnet wird. Der neue letzte zwischengespeicherte Wert (30) wird in die Systemtabellen geschrieben.

Wenn Datenbank-Engine nach der Verwendung von 22 Zahlen beendet wird, wird die nächste beabsichtigte Sequenznummer im Arbeitsspeicher (23) in die Systemtabellen geschrieben und ersetzt die zuvor gespeicherte Zahl.

Nachdem SQL Server neu gestartet wurde und eine Sequenznummer benötigt wird, wird die Startzahl aus den Systemtabellen (23) gelesen. Die Cacheanzahl von 15 Zahlen (23 - 38) wird dem Arbeitsspeicher zugeordnet, und die nächste Nicht-Cache-Zahl (39) wird in die Systemtabellen geschrieben.

Wenn Datenbank-Engine bei einem Ereignis unerwartet beendet wird, z.B. bei einem Stromausfall, startet die Sequenz mit der aus den Systemtabellen gelesenen Zahl (39) neu. Alle dem Arbeitsspeicher zugeordneten Sequenznummern (die nie von einem Benutzer oder einer Anwendung angefordert wurden) gehen verloren. Diese Funktionalität kann Lücken hinterlassen, garantiert jedoch, dass derselbe Wert nie zweimal für ein einzelnes Sequenzobjekt ausgegeben wird, es sei denn, es wird als CYCLE definiert oder manuell neu gestartet.

Der Cache wird im Arbeitsspeicher verwaltet, indem der aktuelle Wert (der letzte ausgegebene Wert) und die Menge der im Cache verbleibenen Werte nachverfolgt werden. Daher ist der vom Cache verwendete Arbeitsspeicher immer doppelt so groß wie zwei Instanzen des Sequenzobjekt-Datentyps.

Durch Festlegen des Cachearguments wird NO CACHE der aktuelle Sequenzwert bei jeder Verwendung einer Sequenz in die Systemtabellen geschrieben. Dies könnte die Leistung verlangsamen, da der Datenträgerzugriff erhöht wird. Die Möglichkeit unbeabsichtigter Lücken wird aber verringert. Lücken können weiterhin auftreten, wenn Zahlen mithilfe der NEXT VALUE FOR Funktionen sp_sequence_get_range angefordert werden, aber die Zahlen werden entweder nicht verwendet oder in nicht abgeschlossenen Transaktionen verwendet.

Wenn ein Sequenzobjekt die CACHE Option verwendet, wenn Sie das Sequenzobjekt neu starten oder die INCREMENTCYCLEMINVALUEMAXVALUEEigenschaften der Cachegröße ändern, wird der Cache vor dem Ändern in die Systemtabellen geschrieben. Anschließend wird der Cache neu geladen, beginnend mit dem aktuellen Wert (d. a. es werden keine Zahlen übersprungen). Die Änderung der Cachegröße wird sofort wirksam.

Cacheoption, wenn zwischengespeicherte Werte verfügbar sind

Der folgende Prozess tritt jedes Mal auf, wenn ein Sequenzobjekt angefordert wird, um den nächsten Wert für die CACHE Option zu generieren, wenn im Speichercache für das Sequenzobjekt nicht verwendete Werte verfügbar sind.

  1. Der nächste Wert für das Sequenzobjekt wird berechnet.
  2. Der neue aktuelle Wert für das Sequenzobjekt wird im Arbeitsspeicher aktualisiert.
  3. Der berechnete Wert wird an die aufrufende Anweisung zurückgegeben.

Cacheoption, wenn der Cache erschöpft ist

Der folgende Prozess tritt jedes Mal auf, wenn ein Sequenzobjekt angefordert wird, um den nächsten Wert für die CACHE Option zu generieren, wenn der Cache erschöpft ist:

  1. Der nächste Wert für das Sequenzobjekt wird berechnet.

  2. Der letzte Wert für den neuen Cache wird berechnet.

  3. Die Systemtabellenzeile für das Sequenzobjekt wird gesperrt, und der in Schritt 2 berechnete Wert (der letzte Wert) wird in die Systemtabelle geschrieben. Ein zwischengespeichertes erweitertes Ereignis wird ausgelöst, um den Benutzer über den neuen dauerhaften Wert zu benachrichtigen.

KEINE CACHEoption

Der folgende Vorgang tritt jedes Mal auf, wenn ein Sequenzobjekt angefordert wird, um den nächsten Wert für die NO CACHE Option zu generieren:

  1. Der nächste Wert für das Sequenzobjekt wird berechnet.
  2. Der neue aktuelle Wert für das Sequenzobjekt wird in die Systemtabelle geschrieben.
  3. Der berechnete Wert wird an die aufrufende Anweisung zurückgegeben.

Metadaten

Weitere Informationen zu Sequenzen erhalten Sie durch Abfragen von sys.sequences.

Sicherheit

Berechtigungen

Erfordert CREATE SEQUENCE, , ALTERoder CONTROL Die Berechtigung für das SCHEMA.

  • Elemente der db_owner und db_ddladmin festen Datenbankrollen können Objekte erstellen, ändern und ablegen.
  • Member der db_owner und db_datawriter festen Datenbankrollen können Sequenzobjekte aktualisieren, indem sie Zahlen generieren.

Im folgenden Beispiel wird dem Benutzer AdventureWorks\Larry die Berechtigung zum Erstellen von Sequenzen im Test Schema erteilt.

GRANT CREATE SEQUENCE
    ON SCHEMA::Test TO [AdventureWorks\Larry];

Der Besitz eines Sequenzobjekts kann mithilfe der ALTER AUTHORIZATION Anweisung übertragen werden.

Wenn eine Sequenz einen benutzerdefinierten Datentyp verwendet, muss der Ersteller der Sequenz über die Berechtigung für den Typ verfügen REFERENCES .

Audit

Um zu überwachen CREATE SEQUENCE, überwachen Sie die SCHEMA_OBJECT_CHANGE_GROUP.

Beispiele

Beispiele für das Erstellen von Sequenzen und die Verwendung der NEXT VALUE FOR Funktion zum Generieren von Sequenznummern finden Sie unter Sequenznummern.

In den meisten der folgenden Beispiele werden Sequenzobjekte in einem Schema namens „Test“ erstellt.

Um das Test-Schema zu erstellen, führen Sie die folgende Anweisung aus.

CREATE SCHEMA Test;
GO

A. Erstellen einer Sequenz, die um 1 erhöht wird

Im folgenden Beispiel erstellt Thierry eine Sequenz mit dem Namen CountBy1, die bei jeder Verwendung um eins erhöht wird.

CREATE SEQUENCE Test.CountBy1
    START WITH 1
    INCREMENT BY 1;
GO

B. Erstellen einer Sequenz, die um 1 verringert wird

Das folgende Beispiel beginnt bei 0 und zählt jedes Mal, wenn es verwendet wird, negative Zahlen um eins.

CREATE SEQUENCE Test.CountByNeg1
    START WITH 0
    INCREMENT BY -1;
GO

C. Erstellen einer Sequenz, die um 5 erhöht wird

Im folgenden Beispiel wird eine Sequenz erstellt, die bei jeder Verwendung um 5 erhöht wird.

CREATE SEQUENCE Test.CountBy1
    START WITH 5
    INCREMENT BY 5;
GO

D: Erstellen einer Sequenz, die mit einer festgelegten Zahl beginnt

Nachdem Thierry eine Tabelle importiert hat, stellt er fest, dass die höchste verwendete ID-Nummer 24,328 ist. Thierry benötigt eine Sequenz, die Zahlen ab 24.329 generiert. Im folgenden Code wird eine Sequenz erstellt, die mit 24,329 startet und um 1 inkrementiert wird.

CREATE SEQUENCE Test.ID_Seq
    START WITH 24329
    INCREMENT BY 1;
GO

E. Erstellen einer Sequenz mit Standardwerten

Im folgenden Beispiel wird eine Sequenz mit den Standardwerten erstellt.

CREATE SEQUENCE Test.TestSequence;

Führen Sie die folgende Anweisung aus, um die Eigenschaften der Sequenz anzuzeigen.

SELECT *
FROM sys.sequences
WHERE name = 'TestSequence';

Eine Teilliste der Ausgabe veranschaulicht die Standardwerte.

Output Standardwert
start_value -9223372036854775808
increment 1
minimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

F. Erstellen einer Sequenz mit einem bestimmten Datentyp

Im folgenden Beispiel wird eine Sequenz erstellt, die den smallint-Datentyp mit einem Bereich von –32.768 bis 32.767 verwendet.

CREATE SEQUENCE SmallSeq
    AS SMALLINT;

G. Erstellen einer Sequenz mit allen Argumenten

Im folgenden Beispiel wird eine Sequenz namens „DecSeq“ erstellt, die den decimal-Datentyp verwendet und einen Bereich von 0 bis 255 aufweist. Die Sequenz beginnt mit 125 und wird immer um 25 inkrementiert, wenn eine Zahl generiert wurde. Da die Sequenz zum Durchlaufen konfiguriert wurde, wird sie beim Überschreiten des maximalen Werts von 200 beim minimalen Wert von 100 neu gestartet.

CREATE SEQUENCE Test.DecSeq
    AS DECIMAL (3, 0)
    START WITH 125
    INCREMENT BY 25
    MINVALUE 100
    MAXVALUE 200
    CYCLE
    CACHE 3;

Führen Sie die folgende Anweisung aus, um den ersten Wert anzuzeigen; die START WITH-Option mit 125.

SELECT  NEXT VALUE FOR Test.DecSeq;

Führen Sie die Anweisung drei weitere Male aus, um 150, 175 und 200 zurückzugeben.

Führen Sie die Anweisung erneut aus, um zu sehen, wie der Startwert zurück zur MINVALUE-Option 100 durchläuft.

Führen Sie den folgenden Code aus, um die Cachegröße zu bestätigen und den aktuellen Wert anzuzeigen.

SELECT cache_size, current_value
FROM sys.sequences
WHERE name = 'DecSeq';