Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
Generuje numer sekwencyjny z określonego obiektu sekwencji.
Pełną dyskusję na temat tworzenia i używania sekwencji można znaleźć w artykule Numery sekwencji. Użyj sp_sequence_get_range do wygenerowania zakresu numerów sekwencyjnych rezerwowych.
Transact-SQL konwencje składni
Składnia
NEXT VALUE FOR [ database_name . ] [ schema_name . ] sequence_name
[ OVER (<over_order_by_clause>) ]
Arguments
database_name
Nazwa bazy danych zawierającej obiekt sekwencji.
schema_name
Nazwa schematu zawierającego obiekt sekwencji.
sequence_name
Nazwa obiektu sekwencji, który generuje tę liczbę.
over_order_by_clause
Określa kolejność, w jakiej wartość sekwencji jest przypisana wierszom w partycji. Aby uzyskać więcej informacji, zobacz OVER Clause (Transact-SQL).
Typy zwracane
Zwraca liczbę używając typu sekwencji.
Uwagi
Funkcja NEXT VALUE FOR może być używana w procedurach i wyzwalaczach.
Gdy funkcja NEXT VALUE FOR jest używana w zapytaniu lub domyślnym ograniczeniu, jeśli ten sam obiekt sekwencji jest używany więcej niż raz, lub jeśli ten sam obiekt sekwencji jest używany zarówno w instrukcji dostarczającej wartości, jak i w wykonywanym domyślnym ograniczeniu, ta sama wartość zostanie zwrócona dla wszystkich kolumn odwołujących się do tej samej sekwencji w wierszu zbioru wyników.
Funkcja NASTĘPNA dla jest niedeterministyczna i dozwolona tylko w kontekstach, gdzie liczba wygenerowanych wartości sekwencji jest dobrze określona. Poniżej znajduje się definicja liczby wartości użytych dla każdego obiektu sekwencji odwołanego w danym zatwierdzeniu:
SELECT - Dla każdego odwołanego obiektu sekwencji nowa wartość jest generowana raz na wiersz w wyniku polecenia.
WSTAW ... WARTOŚCI - Dla każdego odwołanego obiektu sekwencji generowana jest nowa wartość raz dla każdego wprowadzonego wiersza w instrukcji.
AKTUALIZACJA - Dla każdego odwołanego obiektu sekwencji generowana jest nowa wartość dla każdego wiersza aktualizowanego przez dane zdanie.
Instrukcje proceduralne (takie jak DECLARE,SET itp.) – Dla każdego odwołanego obiektu sekwencji generowana jest nowa wartość dla każdego polecenia.
Ograniczenia i ograniczenia
Funkcja NASTĘPNA WARTOŚĆ DLA nie może być użyta w następujących sytuacjach:
Gdy baza danych jest w trybie tylko do odczytu.
Jako argument do funkcji tabelowej.
Jako argument do funkcji agregatu.
W podzapytaniach obejmujących typowe wyrażenia tabelowe i tabele pochodne.
W widokach, w funkcjach definiowanych przez użytkownika lub w kolumnach obliczeniowych.
W zdaniu z użyciem operatorów DISTINCT, UNION, UNION ALL,EXCEPT lub INTERSECT .
W zdaniu z użyciem klauzuli ORDER BY , chyba że NEXT VALUE FOR ... Używa się OVER (ORDER BY ...).
W następujących klauzulach: FETCH, OVER, OUTPUT,ON, PIVOT, UNPIVOT,GROUP BY, HAVING, COMPUTE, COMPUTE BY lub FOR XML.
W wyrażeniach warunkowych z użyciem CASE, CHOOSE, COALESCE,IIF, ISNULL lub NULLIF.
W klauzuli VALUES nie jest częścią instrukcji INSERT .
W definicji ograniczenia sprawdzającego.
W definicji reguły lub domyślnego obiektu. (Może być używany w domyślnym ograniczeniu.)
Domyślnie w typie tabeli zdefiniowanej przez użytkownika.
W instrukcji używającej TOP,OFFSET lub gdy ustawiona jest opcja ROWCOUNT .
W klauzuli WHERE w zdaniu.
W oświadczeniu MERGE . (Z wyjątkiem sytuacji, gdy funkcja NEXT VALUE FOR jest używana w domyślnym ograniczeniu w tabeli docelowej, a domyślna w instrukcji CREATE w instrukcji MERGE .)
Użycie obiektu sekwencji w domyślnym ograniczeniu
Przy użyciu funkcji NEXT VALUE FOR w domyślnym ograniczeniu obowiązują następujące reguły:
Pojedynczy obiekt sekwencji może być odwołany z domyślnych ograniczeń w wielu tabelach.
Tabela i obiekt sekwencji muszą znajdować się w tej samej bazie danych.
Użytkownik dodający domyślne ograniczenie musi mieć uprawnienia REFERENCES na obiekt sekwencji.
Obiekt sekwencji, do którego odwołano się z domyślnego ograniczenia, nie może zostać usunięty przed upuszczeniem domyślnego ograniczenia.
Ten sam numer sekwencyjny jest zwracany dla wszystkich kolumn w wierszu, jeśli wiele domyślnych ograniczeń używa tego samego obiektu sekwencji lub jeśli ten sam obiekt sekwencji jest używany zarówno w instrukcji dostarczającej wartości, jak i w wykonywanym domyślnym ograniczeniu.
Odwołania do funkcji NEXT VALUE FOR w domyślnym ograniczeniu nie mogą określać klauzuli OVER .
Obiekt sekwencji, do którego odwołano w domyślnym ograniczeniu, może zostać zmieniony.
W przypadku
INSERT ... SELECTinstrukcji orINSERT ... EXEC, gdzie dane wstawiane pochodzą z zapytania z klauzulą ORDER BY , wartości zwracane przez funkcję NEXT VALUE FOR będą generowane w kolejności określonej przez klauzulę ORDER BY .
Używając obiektu sekwencji z klauzulą OVER ORDER BY
Funkcja NEXT VALUE FOR obsługuje generowanie posortowanych wartości sekwencji poprzez zastosowanie klauzuli OVER do wywołania NEXT VALUE FOR . Używając klauzuli OVER, użytkownik ma gwarancję, że zwracane wartości są generowane w kolejności podklauzuli ORDER BY w klauzuli OVER. Następujące dodatkowe reguły obowiązują przy użyciu funkcji NEXT VALUE FOR z klauzulą OVER :
Wielokrotne wywołania funkcji NEXT VALUE FOR dla tego samego generatora sekwencji w jednym zatwierdzeniu muszą wszystkie wykorzystywać tę samą definicję klauzuli OVER .
Wielokrotne wywołania funkcji NEXT VALUE FOR odwołujące się do różnych generatorów sekwencji w jednym zatwierdzeniu mogą mieć różne definicje klauzul OVER .
Klauzula OVER zastosowana do funkcji NEXT VALUE FOR nie obsługuje podklauzuli PARTITION BY .
Jeśli wszystkie wywołania funkcji NEXT VALUE FOR w instrukcji SELECT określają klauzulę OVER, w instrukcji SELECT można użyć klauzuli ORDER BY.
Klauzula OVER jest dozwolona z funkcją NEXT VALUE FOR w instrukcji lub
INSERT ... SELECT ...instrukcji SELECT. Użycie klauzuli OVER z funkcją NEXT VALUE FOR nie jest dozwolone w instrukcjach UPDATE ani MERGE .Jeśli inny proces jednocześnie uzyskuje dostęp do obiektu sekwencji, zwrócone liczby mogą mieć luki.
Metadane
Aby uzyskać informacje o sekwencjach, zapytaj w widoku katalogu sys.sequences .
Zabezpieczenia
Permissions
Wymaga uprawnień UPDATE do obiektu sekwencji lub schematu sekwencji. Przykład udzielenia pozwolenia można znaleźć w przykładzie F później w tym temacie.
Łańcuch własności
Obiekty sekwencji wspierają łańcuchowanie własności. Jeśli obiekt sekwencji ma tego samego właściciela co wywoływana procedura przechowywana, wyzwalacz lub tabela (mając obiekt sekwencji jako domyślne ograniczenie), nie jest wymagana żadna kontrola uprawnień do obiektu sekwencji. Jeśli obiekt sekwencji nie należy do tego samego użytkownika co wywoływana procedura przechowywana, wyzwalacz lub tabela, wymagane jest sprawdzenie uprawnień dla obiektu sekwencji.
Gdy funkcja NEXT VALUE FOR jest używana jako wartość domyślna w tabeli, użytkownicy potrzebują zarówno uprawnień INSERT do tabeli, jak i UPDATE do obiektu sekwencji, aby wstawić dane z użyciem domyślnego ustawienia.
Jeśli domyślne ograniczenie ma tego samego właściciela co obiekt sekwencji, nie są wymagane żadne uprawnienia do obiektu sekwencji po wywołaniu domyślnego ograniczenia.
Jeśli domyślne ograniczenie i obiekt sekwencji nie należą do tego samego użytkownika, wymagane są uprawnienia do obiektu sekwencji, nawet jeśli jest on wywoływany przez domyślne ograniczenie.
Audit
Aby przeprowadzić audyt NEXT VALUE FOR FUNCTION, monitoruj SCHEMA_OBJECT_ACCESS_GROUP.
Przykłady
Przykłady zarówno tworzenia sekwencji, jak i użycia funkcji NEXT VALUE FOR do generowania numerów sekwencyjnych, można znaleźć w artykule Numery sekwencji.
Poniższe przykłady wykorzystują sekwencję nazwaną CountBy1 w schemiacie o nazwie Test. Wykonaj następujące zdanie, aby stworzyć sekwencję Test.CountBy1 . Przykłady C i E korzystają z bazy AdventureWorks2025 danych, więc sekwencja CountBy1 jest tworzona w tej bazie.
USE AdventureWorks2022;
GO
CREATE SCHEMA Test;
GO
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1 ;
GO
A. Używanie sekwencji w instrukcji select
Poniższy przykład tworzy sekwencję o nazwie, CountBy1 która zwiększa się o jeden za każdym razem, gdy jest używana.
SELECT NEXT VALUE FOR Test.CountBy1 AS FirstUse;
SELECT NEXT VALUE FOR Test.CountBy1 AS SecondUse;
Oto zestaw wyników.
FirstUse
1
SecondUse
2
B. Ustawianie zmiennej na kolejną wartość sekwencji
Poniższy przykład pokazuje trzy sposoby ustawienia zmiennej na następną wartość numeru sekwencyjnego.
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. Używając sekwencji z funkcją okna rankingu
USE AdventureWorks2022;
GO
SELECT NEXT VALUE FOR Test.CountBy1 OVER (ORDER BY LastName) AS ListNumber,
FirstName, LastName
FROM Person.Contact ;
GO
D. Używając funkcji NEXT VALUE FOR w definicji domyślnego ograniczenia
Obsługiwane jest użycie funkcji NEXT VALUE FOR w definicji domyślnego ograniczenia. Przykład użycia NEXT VALUE FOR w instrukcji CREATE TABLE można znaleźć wPrzykładzie Numery Sekwencji C. Poniższy przykład służy ALTER TABLE do dodawania sekwencji domyślnie do bieżącej tabeli.
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. Używanie funkcji NEXT VALUE FOR w instrukcji INSERT
Poniższy przykład tworzy tabelę o nazwie TestTable i następnie używa tej NEXT VALUE FOR funkcji do wstawienia wiersza.
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. Używając funkcji NEXT VALUE FOR z SELECT ... DO
Poniższy przykład wykorzystuje SELECT ... INTO to zdanie do utworzenia tabeli o nazwie Production.NewLocation i używa NEXT VALUE FOR funkcji do numerowania każdego wiersza.
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. Udzielenie zgody na wykonanie NEXT VALUE FOR
Poniższy przykład przyznaje uprawnienia UPDATE użytkownikowi AdventureWorks\Larry do wykonania NEXT VALUE FOR za pomocą sekwencji Test.CounterSeq .
GRANT UPDATE ON OBJECT::Test.CounterSeq TO [AdventureWorks\Larry] ;
Zobacz też
UTWÓRZ SEKWENCJĘ (Transact-SQL)
CIĄG ALTERA (Transact-SQL)
numery sekwencji