Sdílet prostřednictvím


DALŠÍ HODNOTA PRO (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL 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.

Transact-SQL konvence syntaxe

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 ... EXEC kde 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 neboINSERT ... 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