Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL databáze v Microsoft Fabric
Vytvoří sekvenční objekt a určuje jeho vlastnosti. Sekvence je uživatelem definovaný objekt vázaný na schéma, který generuje posloupnost číselných hodnot podle specifikace, se kterou byla sekvence vytvořena. Posloupnost číselných hodnot se generuje ve vzestupném nebo sestupném pořadí v definovaném intervalu a lze ji nakonfigurovat tak, aby se při vyčerpání restartovala (cyklus).
Sekvence, na rozdíl od sloupců identit, nejsou přidružené ke konkrétním tabulkám. Aplikace odkazují na sekvenční objekt, který načte jeho další hodnotu. Aplikace řídí relaci mezi sekvencemi a tabulkami. Uživatelské aplikace mohou odkazovat na sekvenční objekt a koordinovat hodnoty napříč více řádky a tabulkami.
Na rozdíl od hodnot sloupců identity vygenerovaných při vložení řádků může aplikace získat další pořadové číslo bez vložení řádku voláním funkce NEXT HODNOTA FOR. Pomocí sp_sequence_get_range můžete získat více pořadových čísel najednou.
Informace a scénáře, které používají funkci CREATE SEQUENCE i NEXT VALUE FOR funkci, najdete v tématu Pořadová čísla.
Syntaxe
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
Určuje jedinečný název, podle kterého je posloupnost známá v databázi. Typ je sysname.
[ built_in_integer_type | uživatelská defined_integer_type ]
Posloupnost lze definovat jako libovolný celočíselnou typ. Jsou povoleny následující typy.
- tinyint - Rozsah 0 až 255
- smallint - rozsah -32 768 až 32 767
- int – rozsah -2 147 483 648 až 2 147 483 647
- bigint - rozsah -9 223 372 036 854 775 808 až 9 223 372 036 854 775 807
- desetinné a číselné s škálou 0.
- Libovolný uživatelem definovaný datový typ (typ aliasu), který je založený na jednom z povolených typů.
Pokud není zadaný žádný datový typ, použije se jako výchozí datový typ bigint .
START WITH – konstanta <>
První hodnota vrácená sekvenčním objektem. Hodnota START musí být hodnota menší nebo rovna maximální a větší nebo rovna minimální hodnotě sekvenčního objektu. Výchozí počáteční hodnota nového objektu sekvence je minimální hodnota pro vzestupný sekvenční objekt a maximální hodnota pro sestupný sekvenční objekt.
INCREMENT BY – konstanta <>
Hodnota použitá k přírůstku (nebo dekrementování, pokud je záporná) hodnota sekvenčního objektu NEXT VALUE FOR pro každé volání funkce. Pokud je přírůstková hodnota záporná hodnota, je sestupný objekt sekvence; jinak je vzestupný. Přírůstek nemůže být 0. Výchozí přírůstek nového objektu sekvence je 1.
[ MINVALUE <– konstanta> | NO MINVALUE ]
Určuje hranice objektu sekvence. Výchozí minimální hodnota nového sekvenčního objektu je minimální hodnota datového typu objektu sekvence. To je nula pro datový typ tinyint a záporné číslo pro všechny ostatní datové typy.
[ MAXVALUE <konstanta> | BEZ HODNOTY MAXVALUE
Určuje hranice objektu sekvence. Výchozí maximální hodnota nového sekvenčního objektu je maximální hodnota datového typu sekvenčního objektu.
[ CYKLUS | NO CYCLE ]
Vlastnost, která určuje, zda se má sekvenční objekt restartovat z minimální hodnoty (nebo maximum pro sestupné sekvenční objekty) nebo vyvolat výjimku při překročení minimální nebo maximální hodnoty. Výchozí možnost cyklu pro nové sekvenční objekty je NO CYCLE.
Poznámka:
SEQUENCE Cyklicky se restartuje z minimální nebo maximální hodnoty, nikoli od počáteční hodnoty.
[ MEZIPAMĚŤ [ <konstanta> ] | ŽÁDNÁ MEZIPAMĚŤ ]
Zvyšuje výkon pro aplikace, které používají sekvenční objekty, minimalizací počtu vstupně-výstupních operací disku, které jsou potřeba k vygenerování pořadových čísel. Výchozí hodnota je CACHE.
Pokud je například zvolena velikost mezipaměti 50, SQL Server neuchová 50 jednotlivých hodnot v mezipaměti. Ukládá do mezipaměti pouze aktuální hodnotu a množství hodnot, které zůstaly v mezipaměti. To znamená, že množství paměti potřebné k uložení mezipaměti je vždy dvě instance datového typu objektu sekvence.
Poznámka:
Pokud je možnost mezipaměti povolená bez zadání velikosti mezipaměti, databázový stroj vybere velikost. Uživatelé by ale neměli spoléhat na konzistentní výběr. Microsoft může změnit metodu výpočtu velikosti mezipaměti bez předchozího upozornění.
Při vytváření s CACHE možností může neočekávané vypnutí (například selhání napájení) vést ke ztrátě pořadových čísel zbývajících v mezipaměti.
Poznámky
Pořadová čísla se generují mimo rozsah aktuální transakce. Využívají se bez ohledu na to, jestli je transakce používající pořadové číslo potvrzená nebo vrácená zpět. Duplicitní ověření probíhá pouze po úplném naplnění záznamu. Výsledkem může být v některých případech, kdy se stejné číslo používá pro více než jeden záznam během vytváření, ale pak se identifikuje jako duplikát. Pokud k tomu dojde a další hodnoty automatického čísla byly použity na následné záznamy, může to vést k mezerě mezi hodnotami automatického číslování a očekávaným chováním.
Správa mezipaměti
Aby se zlepšil výkon, SQL Server předem přiděluje počet pořadových čísel určených argumentem CACHE .
Například se vytvoří nová sekvence s počáteční hodnotou 1 a velikostí mezipaměti 15. Když je potřeba první hodnota, zpřístupní se z paměti hodnoty 1 až 15. Poslední hodnota uložená v mezipaměti (15) se zapíše do systémových tabulek na disku. Když se použije všech 15 čísel, další požadavek (číslo 16) způsobí opětovné přidělení mezipaměti. Nová poslední hodnota uložená v mezipaměti (30) se zapíše do systémových tabulek.
Pokud je databázový stroj zastaven po použití 22 čísel, další zamýšlené pořadové číslo v paměti (23) se zapíše do systémových tabulek a nahradí dříve uložené číslo.
Po restartování SQL Serveru a je potřeba pořadové číslo, počáteční číslo se načte ze systémových tabulek (23). Množství mezipaměti 15 čísel (23–38) je přiděleno paměti a další číslo mimo mezipaměť (39) se zapíše do systémových tabulek.
Pokud databázový stroj zastaví neobvykle u události, jako je selhání napájení, sekvence se restartuje s číslem přečteným ze systémových tabulek (39). Všechna pořadová čísla přidělená paměti (ale uživatel nebo aplikace ji nikdy nepožaduje) se ztratí. Tato funkce může zanechat mezery, ale zaručuje, že stejná hodnota nebude nikdy vydána dvakrát pro jeden sekvenční objekt, pokud není definována jako CYCLE nebo ručně restartována.
Mezipaměť se udržuje v paměti sledováním aktuální hodnoty (poslední vystavené hodnoty) a množstvím hodnot, které zůstaly v mezipaměti. Proto množství paměti používané mezipamětí je vždy dvě instance datového typu sekvenčního objektu.
Nastavení argumentu mezipaměti tak, aby NO CACHE zapisuje aktuální hodnotu sekvence do systémových tabulek při každém použití sekvence. To může zpomalit výkon zvýšením přístupu k diskům, ale snižuje pravděpodobnost nechtěných mezer. K mezerám může dojít i v případě, že jsou čísla požadována pomocí NEXT VALUE FOR funkcí sp_sequence_get_range , ale čísla se buď nepoužívají, nebo se používají v nepotvrzených transakcích.
Když sekvenční objekt použije CACHE tuto možnost, pokud restartujete sekvenční objekt nebo změníte INCREMENTvlastnosti velikosti CYCLEMINVALUEMAXVALUEmezipaměti , způsobí zápis mezipaměti do systémových tabulek před změnou. Mezipaměť se pak znovu načte od aktuální hodnoty (to znamená, že se nepřeskočila žádná čísla). Změna velikosti mezipaměti se projeví okamžitě.
Možnost MEZIPAMĚTI, pokud jsou k dispozici hodnoty uložené v mezipaměti
K následujícímu procesu dochází pokaždé, když je požadován sekvenční objekt, aby vygeneroval další hodnotu pro CACHE možnost, pokud jsou v mezipaměti v paměti pro objekt sekvence k dispozici nepoužívané hodnoty.
- Další hodnota pro sekvenční objekt se vypočítá.
- Nová aktuální hodnota pro sekvenční objekt se aktualizuje v paměti.
- Počítaná hodnota se vrátí do volajícího příkazu.
Možnost MEZIPAMĚTI při vyčerpání mezipaměti
K následujícímu procesu dochází při každém vyžádání objektu sekvence, aby vygeneroval další hodnotu pro CACHE tuto možnost, pokud je mezipaměť vyčerpána:
Další hodnota pro sekvenční objekt se vypočítá.
Vypočítá se poslední hodnota nové mezipaměti.
Systémový řádek tabulky pro sekvenční objekt je uzamčen a hodnota vypočítaná v kroku 2 (poslední hodnota) se zapíše do systémové tabulky. Aktivuje se rozšířená událost s vyčerpáním mezipaměti, která uživatele upozorní na novou trvalou hodnotu.
Možnost BEZ MEZIPAMĚTI
K následujícímu procesu dochází pokaždé, když je požadován objekt sekvence k vygenerování další hodnoty pro NO CACHE tuto možnost:
- Další hodnota pro sekvenční objekt se vypočítá.
- Nová aktuální hodnota objektu sekvence je zapsána do systémové tabulky.
- Počítaná hodnota se vrátí do volajícího příkazu.
Metadatové informace
Informace o sekvencích naleznete v dotazu sys.sequences.
Zabezpečení
Povolení
Vyžaduje CREATE SEQUENCE, ALTERnebo CONTROL oprávnění k .SCHEMA
- Členové db_owner a db_ddladmin pevných databázových rolí mohou vytvářet, měnit a odstraňovat sekvenční objekty.
- Členové db_owner a db_datawriter pevných databázových rolí mohou aktualizovat pořadové objekty tím, že je způsobí generování čísel.
Následující příklad uděluje uživateli AdventureWorks\Larry oprávnění k vytváření sekvencí ve schématu Test .
GRANT CREATE SEQUENCE
ON SCHEMA::Test TO [AdventureWorks\Larry];
Vlastnictví sekvenčního objektu lze přenést pomocí ALTER AUTHORIZATION příkazu.
Pokud sekvence používá uživatelem definovaný datový typ, tvůrce sekvence musí mít REFERENCES oprávnění k typu.
Audit
Pokud chcete auditovatCREATE SEQUENCE, monitorujte SCHEMA_OBJECT_CHANGE_GROUP
Examples
Příklady vytváření sekvencí a použití NEXT VALUE FOR funkce k vygenerování pořadových čísel najdete v tématu Pořadová čísla.
Většina následujících příkladů vytváří sekvenční objekty ve schématu s názvem Test.
Pokud chcete vytvořit testovací schéma, spusťte následující příkaz.
CREATE SCHEMA Test;
GO
A. Vytvoření sekvence, která se zvýší o 1
V následujícím příkladu vytvoří Thierry sekvenci s názvem CountBy1, která se zvýší o jednu při každém použití.
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1;
GO
B. Vytvoření sekvence, která se sníží o 1
Následující příklad začíná číslem 0 a při každém použití se spočítá do záporných čísel.
CREATE SEQUENCE Test.CountByNeg1
START WITH 0
INCREMENT BY -1;
GO
C. Vytvoření sekvence, která se zvýší o 5
Následující příklad vytvoří sekvenci, která se při každém použití zvýší o 5.
CREATE SEQUENCE Test.CountBy1
START WITH 5
INCREMENT BY 5;
GO
D. Vytvoření sekvence, která začíná určeným číslem
Po importu tabulky si Thierry všimne, že nejvyšší použité číslo ID je 24 328. Thierry potřebuje sekvenci, která generuje čísla od 24 329. Následující kód vytvoří sekvenci, která začíná 24 329 a zvýší o 1.
CREATE SEQUENCE Test.ID_Seq
START WITH 24329
INCREMENT BY 1;
GO
E. Vytvoření sekvence pomocí výchozích hodnot
Následující příklad vytvoří sekvenci pomocí výchozích hodnot.
CREATE SEQUENCE Test.TestSequence;
Spuštěním následujícího příkazu zobrazte vlastnosti sekvence.
SELECT *
FROM sys.sequences
WHERE name = 'TestSequence';
Částečný seznam výstupu ukazuje výchozí hodnoty.
| Výstup | Výchozí hodnota |
|---|---|
start_value |
-9223372036854775808 |
increment |
1 |
minimum_value |
-9223372036854775808 |
maximum_value |
9223372036854775807 |
is_cycling |
0 |
is_cached |
1 |
current_value |
-9223372036854775808 |
F. Vytvoření sekvence s konkrétním datovým typem
Následující příklad vytvoří sekvenci pomocí malého datového typu s rozsahem od -32 768 do 32 767.
CREATE SEQUENCE SmallSeq
AS SMALLINT;
G. Vytvoření sekvence pomocí všech argumentů
Následující příklad vytvoří sekvenci s názvem DecSeq pomocí desetinného datového typu s rozsahem od 0 do 255. Sekvence začíná číslem 125 a při každém vygenerování čísla se zvýší o 25. Vzhledem k tomu, že je sekvence nakonfigurována tak, aby cyklická, když hodnota překročí maximální hodnotu 200, sekvence se restartuje s minimální hodnotou 100.
CREATE SEQUENCE Test.DecSeq
AS DECIMAL (3, 0)
START WITH 125
INCREMENT BY 25
MINVALUE 100
MAXVALUE 200
CYCLE
CACHE 3;
Spuštěním následujícího příkazu zobrazte první hodnotu; možnost START WITH 125.
SELECT NEXT VALUE FOR Test.DecSeq;
Provedením příkazu třikrát vrátíte 150, 175 a 200.
Spusťte příkaz znovu, abyste viděli, jak se počáteční hodnota cykluje zpět na MINVALUE možnost 100.
Spuštěním následujícího kódu potvrďte velikost mezipaměti a zobrazte aktuální hodnotu.
SELECT cache_size, current_value
FROM sys.sequences
WHERE name = 'DecSeq';
Související obsah
- ALTEROVA SEKVENCE (Transact-SQL)
- DROP SEQUENCE (Transact-SQL)
- DALŠÍ HODNOTA PRO (Transact-SQL)
- Čísla