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
Generuje sekvenční číslo ze specifikovaného sekvenčního objektu.
Pro kompletní diskusi o vytváření i používání sekvencí viz Sekvenční čísla. Použijte sp_sequence_get_range k vytvoření rezervy v rozsahu pořadových čísel.
Syntaxe
NEXT VALUE FOR [ database_name . ] [ schema_name . ] sequence_name
[ OVER (<over_order_by_clause>) ]
Arguments
database_name
Název databáze, která obsahuje sekvenční objekt.
schema_name
Název schématu, které obsahuje sekvenční objekt.
sequence_name
Název sekvenčního objektu, který generuje číslo.
over_order_by_clause
Určuje pořadí, v jakém je sekvenční hodnota přiřazena řádkům v rozkladu. Pro více informací viz OVER Clause (Transact-SQL).
Návratové typy
Vrátí číslo pomocí typu posloupnosti.
Poznámky
Funkce NEXT VALUE FOR může být použita v uložených procedurách a triggerech.
Když je funkce NEXT VALUE FOR použita v dotazu nebo výchozím omezení, pokud je stejný sekvenční objekt použit vícekrát, nebo pokud je stejný sekvenční objekt použit jak ve příkazu, který poskytuje hodnoty, tak při vykonávání výchozího omezení, bude stejná hodnota vrácena pro všechny sloupce odkazující na stejnou sekvenci v řádku ve výsledné množině.
Funkce NEXT VALUE pro je nedeterministická a je povolena pouze v kontextech, kde je počet generovaných sekvenčních hodnot dobře definován. Níže je definice počtu hodnot, které budou použity pro každý odkazovaný sekvenční objekt v daném příkazu:
SELECT - Pro každý odkazovaný sekvenční objekt je v výsledku příkazu generována nová hodnota jednou za řádek.
VLOŽIT ... HODNOTY - Pro každý odkazovaný sekvenční objekt je pro každý vložený řádek ve příkazu generována nová hodnota.
AKTUALIZACE - Pro každý odkazovaný sekvenční objekt je generována nová hodnota pro každý řádek, který je příkazem aktualizován.
Procedurální příkazy (například DECLARE,SET atd.) – Pro každý odkazovaný sekvenční objekt je pro každý příkaz generována nová hodnota.
Limitace a omezení
Funkce NEXT VALUE FOR nelze použít v následujících situacích:
Když je databáze v režimu pouze pro čtení.
Jako argument k tabulové funkci.
Jako argument k agregované funkci.
V poddotazech zahrnujících běžné tabulkové výrazy a odvozené tabulky.
V pohledech, v uživatelsky definovaných funkcích nebo ve vypočtených sloupcích.
Ve výroku používajícím operátory DISTINCT, UNION, UNION ALL,EXCEPT nebo INTERSECT .
Ve výroku používajícím klauzuli ORDER BY , pokud není NEXT VALUE FOR ... OVER (ORDER BY ...).
V následujících klauzulích: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY,HAVING, COMPUTE, COMPUTE BY nebo FOR XML.
V podmíněných výrazech používajících CASE, CHOOSE, COALESCE, IIF, ISNULL nebo NULLIF.
V klauzuli VALUES není součástí příkazu INSERT .
V definici kontrolního omezení.
V definici pravidla nebo výchozího objektu. (Lze jej použít ve výchozím omezení.)
Jako výchozí nastavení v uživatelsky definovaném typu tabulky.
Ve příkazu používajícím TOP,OFFSET nebo když je nastavena volba ROWCOUNT .
V klauzuli WHERE ve výroku.
V prohlášení MERGE . (Kromě případů, kdy je funkce NEXT VALUE FOR použita ve výchozím omezení v cílové tabulce a výchozí je použita v příkazu CREATE v příkazu MERGE .)
Použití sekvenčního objektu ve výchozím omezení
Při použití funkce NEXT VALUE FOR ve výchozím omezení platí následující pravidla:
Jeden sekvenční objekt může být odkazován z výchozích omezení ve více tabulkách.
Tabulka a sekvenční objekt musí být ve stejné databázi.
Uživatel, který přidává výchozí omezení, musí mít na sekvenčním objektu oprávnění ODKAZY.
Sekvenční objekt, na který se odkazuje z výchozího omezení, nemůže být odstraněn dříve, než je výchozí omezení odstraněno.
Stejné sekvenční číslo se vrací pro všechny sloupce v řádku, pokud více výchozích omezení používá stejný sekvenční objekt, nebo pokud je stejný sekvenční objekt použit jak ve příkazu, který poskytuje hodnoty, tak v defaultním omezení, které se vykonává.
Odkazy na funkci NEXT VALUE FOR ve výchozím omezení nemohou specifikovat klauzuli OVER .
Sekvenční objekt, na který je odkazováno ve výchozím omezení, lze upravit.
V případě příkazu or
INSERT ... SELECT(or příkaz),INSERT ... EXECkde data vkládaná pocházejí z dotazu používajícího klauzuli ORDER BY, budou hodnoty vrácené funkcí NEXT VALUE FOR generovány v pořadí určeném klauzulí ORDER BY.
Použití sekvenčního objektu s OVER ORDER BY Clause
Funkce NEXT VALUE FOR podporuje generování seřazených sekvenčních hodnot aplikací klauzule OVER na volání NEXT VALUE FOR . Použitím klauzule OVER má uživatel zaručeno, že vrácené hodnoty jsou generovány v pořadí podklauzule ORDER BY v klauzuli OVER. Při použití funkce NEXT VALUE FOR s klauzulí OVER platí následující dodatečná pravidla:
Vícenásobné volání funkce NEXT VALUE FOR pro stejný generátor sekvencí v jednom příkazu musí všechny používat stejnou definici klauzule OVER .
Více volání funkce NEXT VALUE FOR, která odkazují na různé generátory sekvencí v jednom příkazu, může mít různé definice klauzule OVER .
Klauzule OVER aplikovaná na funkci NEXT VALUE FOR nepodporuje podklauzuli PARTITION BY .
Pokud všechna volání funkce NEXT VALUE FOR v příkazu SELECT specifikují klauzuli OVER, lze v příkazu SELECT použít klauzuli ORDER BY.
Klauzule OVER je povolena s funkcí NEXT VALUE FOR při použití v příkazu nebo
INSERT ... SELECT ...příkazu SELECT. Použití klauzule OVER s funkcí NEXT VALUE FOR není povoleno v příkazech UPDATE nebo MERGE .Pokud jiný proces přistupuje k sekvenčnímu objektu současně, mohou být vrácená čísla mezer.
Metadatové informace
Pro informace o sekvencích se zeptejte do katalogu sys.sequences .
Zabezpečení
Povolení
Vyžaduje oprávnění UPDATE na objekt sekvence nebo schéma sekvence. Pro příklad udělení povolení viz příklad F později v tomto tématu.
Řetězení vlastnictví
Sekvenční objekty podporují řetězení vlastnictví. Pokud má sekvenční objekt stejného vlastníka jako volající uložená procedura, spouštěč nebo tabulka (s objektem sekvence jako výchozím omezením), není na objektu sekvence vyžadována kontrola oprávnění. Pokud objekt sekvence není vlastněn stejným uživatelem jako volající uložená procedura, spouštěč nebo tabulka, je na objektu sekvence vyžadována kontrola oprávnění.
Když je funkce NEXT VALUE FOR použita jako výchozí hodnota v tabulce, uživatelé potřebují jak oprávnění INSERT na tabulce, tak UPDATE na sekvenčním objektu, aby mohli vložit data pomocí výchozího nastavení.
Pokud má výchozí omezení stejného vlastníka jako sekvenční objekt, nejsou na sekvenčním objektu vyžadována žádná oprávnění, když je výchozí omezení vyvoláno.
Pokud výchozí omezení a sekvenční objekt nejsou vlastněny stejným uživatelem, jsou na sekvenčním objektu vyžadována oprávnění, i když je vyvolán přes výchozí omezení.
Audit
Pro audit DALŠÍ HODNOTY PRO funkci sledujte SCHEMA_OBJECT_ACCESS_GROUP.
Examples
Pro příklady jak vytváření sekvencí, tak použití funkce NEXT VALUE FOR pro generování čísel pořadí viz Sekvenční čísla.
Následující příklady používají posloupnost pojmenovanou CountBy1 ve schématu nazvaném Test. Proveďte následující příkaz pro vytvoření sekvence Test.CountBy1 . Příklady C a E používají databázi AdventureWorks2025 , takže sekvence CountBy1 se vytváří v této databázi.
USE AdventureWorks2022;
GO
CREATE SCHEMA Test;
GO
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1 ;
GO
A. Použití sekvence v příkazu select
Následující příklad vytváří posloupnost s názvy, CountBy1 která se při každém použití zvyšuje o jednu.
SELECT NEXT VALUE FOR Test.CountBy1 AS FirstUse;
SELECT NEXT VALUE FOR Test.CountBy1 AS SecondUse;
Tady je soubor výsledků.
FirstUse
1
SecondUse
2
B. Nastavení proměnné na další hodnotu sekvence
Následující příklad ukazuje tři způsoby, jak nastavit proměnnou na další hodnotu pořadového čísla.
DECLARE @myvar1 BIGINT = NEXT VALUE FOR Test.CountBy1
DECLARE @myvar2 BIGINT ;
DECLARE @myvar3 BIGINT ;
SET @myvar2 = NEXT VALUE FOR Test.CountBy1 ;
SELECT @myvar3 = NEXT VALUE FOR Test.CountBy1 ;
SELECT @myvar1 AS myvar1, @myvar2 AS myvar2, @myvar3 AS myvar3 ;
GO
C. Použití posloupnosti s funkcí rank window
USE AdventureWorks2022;
GO
SELECT NEXT VALUE FOR Test.CountBy1 OVER (ORDER BY LastName) AS ListNumber,
FirstName, LastName
FROM Person.Contact ;
GO
D. Použití funkce NEXT VALUE FOR v definici výchozího omezení
Je podporováno použití funkce NEXT VALUE FOR v definici výchozího omezení. Pro příklad použití NEXT VALUE FOR v příkazu CREATE TABLE vizPříklad C Sequence Numbers. Následující příklad používá ALTER TABLE přidání sekvence jako výchozí do aktuální tabulky.
CREATE TABLE Test.MyTable
(
IDColumn NVARCHAR(25) PRIMARY KEY,
name VARCHAR(25) NOT NULL
) ;
GO
CREATE SEQUENCE Test.CounterSeq
AS INT
START WITH 1
INCREMENT BY 1 ;
GO
ALTER TABLE Test.MyTable
ADD
DEFAULT N'AdvWorks_' +
CAST(NEXT VALUE FOR Test.CounterSeq AS NVARCHAR(20))
FOR IDColumn;
GO
INSERT Test.MyTable (name)
VALUES ('Larry') ;
GO
SELECT * FROM Test.MyTable;
GO
E. Použití funkce NEXT VALUE FOR v příkazu INSERT
Následující příklad vytvoří tabulku s názvem TestTable a poté pomocí NEXT VALUE FOR funkce vloží řádek.
CREATE TABLE Test.TestTable
(CounterColumn INT PRIMARY KEY,
Name NVARCHAR(25) NOT NULL) ;
GO
INSERT Test.TestTable (CounterColumn,Name)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Syed') ;
GO
SELECT * FROM Test.TestTable;
GO
E. Použitím funkce NEXT VALUE FOR s SELECT ... DO
Následující příklad používá SELECT ... INTO příkaz k vytvoření tabulky s názvem Production.NewLocation a používá NEXT VALUE FOR funkci k očíslování každého řádku.
USE AdventureWorks2022;
GO
SELECT NEXT VALUE FOR Test.CountBy1 AS LocNumber, Name
INTO Production.NewLocation
FROM Production.Location ;
GO
SELECT * FROM Production.NewLocation ;
GO
F. Udělení oprávnění k vykonání NEXT VALUE FOR
Následující příklad uděluje oprávnění UPDATE uživateli jménem AdventureWorks\Larry k vykonání NEXT VALUE FOR této sekvence Test.CounterSeq .
GRANT UPDATE ON OBJECT::Test.CounterSeq TO [AdventureWorks\Larry] ;
Viz také
CREATE SEQUENCE (Transact-SQL)
ALTEROVA SEKVENCE (Transact-SQL)
pořadových čísel