Udostępnij za pomocą


UTWÓRZ SEKWENCJĘ (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Tworzy obiekt sekwencji i określa jego właściwości. Sekwencja to obiekt powiązany schematu zdefiniowany przez użytkownika, który generuje sekwencję wartości liczbowych zgodnie ze specyfikacją, z którą utworzono sekwencję. Sekwencja wartości liczbowych jest generowana w kolejności rosnącej lub malejącej w zdefiniowanym interwale i może zostać skonfigurowana do ponownego uruchomienia (cyklu) po wyczerpaniu.

Sekwencje, w przeciwieństwie do kolumn tożsamości, nie są skojarzone z określonymi tabelami. Aplikacje odwołują się do obiektu sekwencji w celu pobrania następnej wartości. Relacja między sekwencjami i tabelami jest kontrolowana przez aplikację. Aplikacje użytkowników mogą odwoływać się do obiektu sekwencji i koordynować wartości w wielu wierszach i tabelach.

W przeciwieństwie do wartości kolumn tożsamości generowanych podczas wstawiania wierszy aplikacja może uzyskać następny numer sekwencji bez wstawiania wiersza, wywołując wartość NEXT FOR. Użyj sp_sequence_get_range , aby jednocześnie uzyskać wiele numerów sekwencji.

Aby uzyskać informacje i scenariusze, które korzystają zarówno z funkcji, jak CREATE SEQUENCE i NEXT VALUE FOR funkcji, zobacz Numery sekwencji.

Transact-SQL konwencje składni

Składnia

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 } ]
    [ ; ]

Arguments

sequence_name

Określa unikatową nazwę, za pomocą której sekwencja jest znana w bazie danych. Typ to sysname.

[ built_in_integer_type | user-defined_integer_type ]

Sekwencja może być zdefiniowana jako dowolna liczba całkowita. Dozwolone są następujące typy.

  • tinyint — zakres od 0 do 255
  • smallint — zakres -32 768 do 32 767
  • int — zakres -2,147,483,648 do 2,147,483,647
  • bigint - Zakres -9,223,372,036,854,775,808 do 9,223,372,036,854,775,807
  • dziesiętne i liczbowe ze skalą 0.
  • Dowolny typ danych zdefiniowany przez użytkownika (typ aliasu) oparty na jednym z dozwolonych typów.

Jeśli nie podano żadnego typu danych, typ danych bigint jest używany jako domyślny.

ROZPOCZNIJ OD <STAŁEJ>

Pierwsza wartość zwrócona przez obiekt sekwencji. Wartość START musi być wartością mniejszą lub równą maksymalnej lub większej lub równej minimalnej wartości obiektu sekwencji. Domyślna wartość początkowa dla nowego obiektu sekwencji to minimalna wartość obiektu sekwencji rosnącej i maksymalna wartość obiektu sekwencji malejącej.

PRZYROST WEDŁUG <stałej>

Wartość używana do przyrostowania (lub dekrementacji, jeśli ujemna) wartość obiektu sekwencji dla każdego wywołania NEXT VALUE FOR funkcji. Jeśli przyrost jest wartością ujemną, obiekt sekwencji malejąco; w przeciwnym razie jest rosnąco. Przyrost nie może być 0. Domyślny przyrost dla nowego obiektu sekwencji to 1.

[ Stała< MINVALUE >| NO MINVALUE ]

Określa granice obiektu sekwencji. Domyślna minimalna wartość dla nowego obiektu sekwencji to minimalna wartość typu danych obiektu sekwencji. Jest to zero dla typu danych tinyint i liczby ujemnej dla wszystkich innych typów danych.

[ STAŁA< MAXVALUE >| BRAK WARTOŚCI MAXVALUE

Określa granice obiektu sekwencji. Domyślna wartość maksymalna dla nowego obiektu sekwencji to maksymalna wartość typu danych obiektu sekwencji.

[ CYCLE | BRAK CYKLU ]

Właściwość określająca, czy obiekt sekwencji powinien zostać uruchomiony ponownie z minimalnej wartości (lub maksymalnej dla obiektów sekwencji malejącej) lub zgłosić wyjątek w przypadku przekroczenia wartości minimalnej lub maksymalnej. Domyślną opcją cyklu dla nowych obiektów sekwencji jest NO CYCLE.

Uwaga / Notatka

Przechodzenie na SEQUENCE rowerze powoduje ponowne uruchomienie z wartości minimalnej lub maksymalnej, a nie od wartości początkowej.

[ PAMIĘĆ PODRĘCZNA [ <stała> ] | BRAK PAMIĘCI PODRĘCZNEJ ]

Zwiększa wydajność aplikacji korzystających z obiektów sekwencji, minimalizując liczbę operacji we/wy dysku wymaganych do generowania numerów sekwencji. Wartość domyślna to CACHE.

Jeśli na przykład wybrano rozmiar pamięci podręcznej 50, program SQL Server nie przechowuje 50 pojedynczych wartości w pamięci podręcznej. Buforuje tylko bieżącą wartość i ilość wartości pozostawionych w pamięci podręcznej. Oznacza to, że ilość pamięci wymaganej do przechowywania pamięci podręcznej to zawsze dwa wystąpienia typu danych obiektu sekwencji.

Uwaga / Notatka

Jeśli opcja pamięci podręcznej jest włączona bez określania rozmiaru pamięci podręcznej, aparat bazy danych wybierze rozmiar. Jednak użytkownicy nie powinni polegać na tym, że wybór jest spójny. Firma Microsoft może zmienić metodę obliczania rozmiaru pamięci podręcznej bez powiadomienia.

Po utworzeniu przy użyciu CACHE opcji nieoczekiwane zamknięcie (takie jak awaria zasilania) może spowodować utratę numerów sekwencji pozostałych w pamięci podręcznej.

Uwagi

Numery sekwencji są generowane poza zakresem bieżącej transakcji. Są one używane niezależnie od tego, czy transakcja przy użyciu numeru sekwencji została zatwierdzona, czy wycofana. Zduplikowana weryfikacja odbywa się tylko po pełnym wypełnieniu rekordu. Może to spowodować, że w niektórych przypadkach ta sama liczba jest używana dla więcej niż jednego rekordu podczas tworzenia, ale następnie jest identyfikowana jako duplikat. Jeśli tak się stanie, a inne wartości autonumerowania zostały zastosowane do kolejnych rekordów, może to spowodować przerwę między wartościami autonumerowania i oczekiwanym zachowaniem.

Zarządzanie pamięcią podręczną

Aby zwiększyć wydajność, program SQL Server wstępnie przydziela liczbę numerów sekwencji określonych przez CACHE argument.

Na przykład nowa sekwencja jest tworzona z wartością początkową 1 i rozmiarem pamięci podręcznej 15. Gdy pierwsza wartość jest potrzebna, wartości od 1 do 15 są udostępniane z pamięci. Ostatnia buforowana wartość (15) jest zapisywana w tabelach systemowych na dysku. Gdy są używane wszystkie 15 liczb, następne żądanie (dla numeru 16) spowoduje ponowne przydzielenie pamięci podręcznej. Nowa ostatnia buforowana wartość (30) jest zapisywana w tabelach systemowych.

Jeśli aparat bazy danych zostanie zatrzymany po użyciu 22 liczb, następny zamierzony numer sekwencji w pamięci (23) zostanie zapisany w tabelach systemowych, zastępując poprzednio przechowywany numer.

Po ponownym uruchomieniu programu SQL Server i wymaganym numerem sekwencji numer początkowy jest odczytywany z tabel systemowych (23). Ilość pamięci podręcznej 15 liczb (23–38) jest przydzielana do pamięci, a następny numer niebuforny (39) jest zapisywany w tabelach systemowych.

Jeśli aparat bazy danych zatrzyma się nieprawidłowo dla zdarzenia, takiego jak awaria zasilania, sekwencja zostanie ponownie uruchomiona z numerem odczytanym z tabel systemowych (39). Wszystkie numery sekwencji przydzielone do pamięci (ale nigdy nie są wymagane przez użytkownika lub aplikację) zostaną utracone. Ta funkcja może pozostawić luki, ale gwarantuje, że ta sama wartość nigdy nie zostanie wydana dwa razy dla pojedynczego obiektu sekwencji, chyba że jest zdefiniowany jako CYCLE lub jest ręcznie uruchamiany ponownie.

Pamięć podręczna jest przechowywana w pamięci, śledząc bieżącą wartość (ostatnią wystawioną wartość) i ilość wartości pozostawionych w pamięci podręcznej. W związku z tym ilość pamięci używanej przez pamięć podręczną to zawsze dwa wystąpienia typu danych obiektu sekwencji.

Ustawienie argumentu pamięci podręcznej w celu NO CACHE zapisania bieżącej wartości sekwencji w tabelach systemowych za każdym razem, gdy jest używana sekwencja. Może to spowolnić wydajność przez zwiększenie dostępu do dysku, ale zmniejsza prawdopodobieństwo niezamierzonych luk. Luki mogą nadal występować, jeśli liczby są żądane przy użyciu NEXT VALUE FOR funkcji lub sp_sequence_get_range , ale liczby nie są używane lub są używane w niezatwierdzonych transakcjach.

Jeśli obiekt sekwencji używa CACHE opcji, jeśli ponownie uruchomisz obiekt sekwencji lub zmienisz INCREMENTwłaściwości , CYCLE, MINVALUE, MAXVALUElub rozmiar pamięci podręcznej, spowoduje to zapisanie pamięci podręcznej w tabelach systemowych przed zmianą. Następnie pamięć podręczna zostanie ponownie załadowana, zaczynając od bieżącej wartości (oznacza to, że nie pominięto żadnych liczb). Zmiana rozmiaru pamięci podręcznej jest obowiązuje natychmiast.

Opcja PAMIĘCI PODRĘCZNEj, gdy buforowane wartości są dostępne

Następujący proces występuje za każdym razem, gdy obiekt sekwencji jest proszony o wygenerowanie następnej wartości dla CACHE opcji, jeśli w pamięci podręcznej obiektu sekwencji są dostępne nieużywane wartości.

  1. Obliczana jest następna wartość obiektu sekwencji.
  2. Nowa bieżąca wartość obiektu sekwencji jest aktualizowana w pamięci.
  3. Wartość obliczeniowa jest zwracana do instrukcji wywołującej.

Opcja PAMIĘCI PODRĘCZNEj po wyczerpaniu pamięci podręcznej

Następujący proces występuje za każdym razem, gdy obiekt sekwencji jest proszony o wygenerowanie następnej wartości dla CACHE opcji, jeśli pamięć podręczna zostanie wyczerpana:

  1. Obliczana jest następna wartość obiektu sekwencji.

  2. Ostatnia wartość nowej pamięci podręcznej jest obliczana.

  3. Wiersz tabeli systemowej dla obiektu sekwencji jest zablokowany, a wartość obliczona w kroku 2 (ostatnia wartość) jest zapisywana w tabeli systemowej. Zostanie wyzwolone zdarzenie rozszerzone z pamięci podręcznej, aby powiadomić użytkownika o nowej utrwalonej wartości.

OPCJA BRAK PAMIĘCI PODRĘCZNEJ

Następujący proces występuje za każdym razem, gdy obiekt sekwencji jest proszony o wygenerowanie następnej wartości dla NO CACHE opcji:

  1. Obliczana jest następna wartość obiektu sekwencji.
  2. Nowa bieżąca wartość obiektu sekwencji jest zapisywana w tabeli systemowej.
  3. Wartość obliczeniowa jest zwracana do instrukcji wywołującej.

Metadane

Aby uzyskać informacje o sekwencjach, wykonaj zapytanie sys.sequences.

Zabezpieczenia

Permissions

Wymaga CREATE SEQUENCEuprawnień , ALTERlub CONTROL w obiekcie SCHEMA.

  • Elementy członkowskie db_owner i db_ddladmin stałych ról bazy danych mogą tworzyć, zmieniać i usuwać obiekty sekwencji.
  • Elementy członkowskie db_owner i db_datawriter stałych ról bazy danych mogą aktualizować obiekty sekwencji, powodując generowanie liczb.

Poniższy przykład przyznaje użytkownikowi AdventureWorks\Larry uprawnienia do tworzenia sekwencji w schemacie Test .

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

Własność obiektu sekwencji można przenieść przy użyciu instrukcji ALTER AUTHORIZATION .

Jeśli sekwencja używa typu danych zdefiniowanego przez użytkownika, twórca sekwencji musi mieć REFERENCES uprawnienia do typu.

Audit

Aby przeprowadzić inspekcję CREATE SEQUENCE, monitoruj element SCHEMA_OBJECT_CHANGE_GROUP.

Przykłady

Aby zapoznać się z przykładami tworzenia sekwencji i używania funkcji do generowania NEXT VALUE FOR numerów sekwencji, zobacz Numery sekwencji.

Większość poniższych przykładów tworzy obiekty sekwencji w schemacie o nazwie Test.

Aby utworzyć schemat testowy, wykonaj następującą instrukcję.

CREATE SCHEMA Test;
GO

A. Tworzenie sekwencji, która zwiększa się o 1

W poniższym przykładzie Firma Thierry tworzy sekwencję o nazwie CountBy1, która zwiększa się o jeden za każdym razem, gdy jest używany.

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

B. Tworzenie sekwencji, która zmniejsza się o 1

Poniższy przykład rozpoczyna się od 0 i jest liczone do liczb ujemnych po jednym za każdym razem, gdy jest używany.

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

C. Tworzenie sekwencji, która zwiększa się o 5

Poniższy przykład tworzy sekwencję, która zwiększa się o 5 za każdym razem, gdy jest używana.

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

D. Tworzenie sekwencji rozpoczynającej się od wyznaczonej liczby

Po zaimportowaniu tabeli Thierry zauważa, że najwyższy używany numer identyfikatora to 24 328. Thierry potrzebuje sekwencji, która generuje liczby rozpoczynające się od 24 329. Poniższy kod tworzy sekwencję, która rozpoczyna się od 24 329 i zwiększa się o 1.

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

E. Tworzenie sekwencji przy użyciu wartości domyślnych

Poniższy przykład tworzy sekwencję przy użyciu wartości domyślnych.

CREATE SEQUENCE Test.TestSequence;

Wykonaj następującą instrukcję, aby wyświetlić właściwości sekwencji.

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

Częściowa lista danych wyjściowych przedstawia wartości domyślne.

Wynik Wartość domyślna
start_value -9223372036854775808
increment 1
minimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

F. Tworzenie sekwencji z określonym typem danych

Poniższy przykład tworzy sekwencję przy użyciu typu danych smallint z zakresem od -32 768 do 32 767.

CREATE SEQUENCE SmallSeq
    AS SMALLINT;

G. Tworzenie sekwencji przy użyciu wszystkich argumentów

Poniższy przykład tworzy sekwencję o nazwie DecSeq przy użyciu typu danych dziesiętnych o zakresie od 0 do 255. Sekwencja rozpoczyna się od 125 i zwiększa się o 25 za każdym razem, gdy jest generowana liczba. Ponieważ sekwencja jest skonfigurowana do cyklu, gdy wartość przekracza maksymalną wartość 200, sekwencja jest uruchamiana ponownie przy minimalnej wartości 100.

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

Wykonaj następującą instrukcję, aby wyświetlić pierwszą wartość; START WITH opcja 125.

SELECT  NEXT VALUE FOR Test.DecSeq;

Wykonaj instrukcję trzy razy, aby zwrócić 150, 175 i 200.

Ponownie wykonaj instrukcję, aby zobaczyć, jak wartość początkowa powraca do MINVALUE opcji 100.

Wykonaj następujący kod, aby potwierdzić rozmiar pamięci podręcznej i wyświetlić bieżącą wartość.

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