Поделиться через


NEXT VALUE FOR (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Формирует номер последовательности из указанного объекта последовательности.

Полное описание создания и использования последовательностей см. в разделе Последовательности чисел. Используйте sp_sequence_get_range, чтобы создать резерв диапазона порядковых номеров.

Соглашения о синтаксисе Transact-SQL

Синтаксис

NEXT VALUE FOR [ database_name . ] [ schema_name . ]  sequence_name  
   [ OVER (<over_order_by_clause>) ]  

Аргументы

database_name
Имя базы данных, содержащей объект последовательности.

schema_name
Имя схемы, содержащей объект последовательности.

sequence_name
Имя последовательности, содержащей объект, который формирует номер.

over_order_by_clause
Определяет порядок, в котором значение последовательности присваивается строкам в секции. Дополнительные сведения см. в статье Предложение OVER (Transact-SQL).

Типы возвращаемых данных

Возвращает число с использованием типа последовательности.

Замечания

Функция NEXT VALUE FOR может использоваться в хранимых процедурах и триггерах.

Когда функция NEXT VALUE FOR используется в запросе или ограничении по умолчанию, если один и тот же объект последовательности используется несколько раз либо если один и тот же объект последовательности используется и в инструкции, поставляющей значения, и в выполняемом ограничении по умолчанию, то для всех столбцов, ссылающихся на одну последовательность в пределах строки в результирующем наборе, возвращается одно и то же значение.

Функция NEXT VALUE FOR является недетерминированной и допустима только в тех контекстах, в которых номера из формируемой последовательности правильно определены. Ниже приводятся определения того, как много значений будет использовано для каждого из упоминаемых объектов последовательности в данной инструкции:

  • SELECT — для каждого указанного объекта последовательности новое значение формируется один раз для каждой строки результата выполнения инструкции.

  • INSERT ... VALUE — для каждого объекта последовательности, на который ссылается ссылка, создается новое значение один раз для каждой вставленной строки в инструкции.

  • UPDATE — для каждого указанного объекта последовательности новое значение формируется один раз для каждой строки, обновляемой в инструкции.

  • Процедурные инструкции (DECLARE, SET и т. д.) — для каждого указанного объекта последовательности новое значение формируется для каждой инструкции.

Ограничения

Функция NEXT VALUE FOR не может использоваться в следующих случаях:

  • Если база данных находится в режиме только для чтения.

  • В качестве аргумента функции с табличным значением.

  • В качестве аргумента агрегатной функции.

  • Во вложенных запросах, включающих обобщенные табличные выражения и производные таблицы.

  • В представлениях, определяемых пользователем функциях, вычисляемых столбцах.

  • В инструкциях с операторами DISTINCT, UNION, UNION ALL, EXCEPT или INTERSECT.

  • В инструкции с помощью предложения ORDER BY , если только NEXT VALUE FOR ... Используется OVER (ORDER BY ...).

  • В следующих предложениях: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING, COMPUTE, COMPUTE BY или FOR XML.

  • В условных выражениях с использованием CASE, CHOOSE, COALESCE, IIF, ISNULL или NULLIF.

  • В предложении VALUES, которое не является частью инструкции INSERT.

  • В определении проверочного ограничения.

  • В определении правила или объекта "значение по умолчанию". (Может использоваться в ограничении по умолчанию.)

  • Используется по умолчанию в определяемом пользователем типе.

  • В инструкции, в которой используется TOP или OFFSET, или при установке параметра ROWCOUNT.

  • В предложении WHERE инструкции.

  • В инструкции MERGE. (За исключением случая, когда функция NEXT VALUE FOR используется в ограничении по умолчанию в целевой таблице, а ограничение по умолчанию используется в инструкции CREATE из инструкции MERGE.)

Использование объекта последовательности в ограничении по умолчанию

При использовании функции NEXT VALUE FOR в ограничении по умолчанию действуют следующие правила:

  • Один объект последовательности может указываться из ограничений по умолчанию нескольких таблиц.

  • Таблица и объект последовательности должны находиться в одной и той же базе данных.

  • Пользователь, добавляющий ограничение по умолчанию, должен иметь разрешение REFERENCES для объекта последовательности.

  • Объект последовательности, указанный из ограничения по умолчанию, не может быть удален до тех пор, пока не удалено само ограничение по умолчанию.

  • Если один и тот же объект последовательности указан в нескольких ограничениях по умолчанию либо и в инструкции, поставляющей значения, и в выполняемом ограничении по умолчанию, то для всех столбцов в строке возвращается один и тот же номер последовательности.

  • В ссылке на функцию NEXT VALUE FOR в ограничении по умолчанию не может быть указано предложение OVER.

  • Объект последовательности, указанный в ограничении по умолчанию, может быть изменен.

  • В инструкциях INSERT ... SELECT и INSERT ... EXEC, где вставляемые данные поступают из запроса с предложением ORDER BY, значения, возвращаемые функцией NEXT VALUE FOR, будут формироваться в порядке, указанном в предложении ORDER BY.

Использование объекта последовательности с предложением OVER ORDER BY

Функция NEXT VALUE FOR поддерживает формирование отсортированных значений последовательности при указании предложения OVER в вызове NEXT VALUE FOR. При использовании предложения OVER пользователю гарантированно будут возвращены значения, сформированные в порядке, который определен вложенным предложением ORDER BY предложения OVER. При использовании функции NEXT VALUE FOR в предложении OVER действуют следующие дополнительные правила:

  • Если в одной инструкции имеется несколько вызовов функции NEXT VALUE FOR для одного и того же генератора последовательности, то все они должны иметь одно и то же определение предложения OVER.

  • Если в одной инструкции имеется несколько вызовов функции NEXT VALUE FOR для разных генераторов последовательностей, то они могут иметь разные определения предложения OVER.

  • В вызовах функции NEXT VALUE FOR с предложением OVER не поддерживается вложенное предложение PARTITION BY.

  • Если во всех вызовах функции NEXT VALUE FOR в инструкции SELECT указано предложение OVER, то предложение ORDER BY можно использовать в инструкции SELECT.

  • Предложение OVER допустимо для функции NEXT VALUE FOR только в инструкциях SELECT или INSERT ... SELECT .... Использование предложения OVER в функции NEXT VALUE FOR не допускается в инструкции UPDATE или MERGE.

  • Если доступ к объекту последовательности в то же самое время производится и из другого процесса, то в возвращаемых номерах могут быть пропуски.

Метаданные

Чтобы получить сведения о последовательностях, запросите представление каталога sys.sequences.

Безопасность

Разрешения

Требуется разрешение UPDATE для объекта последовательности или схемы последовательности. Пример предоставления разрешения см. в примере Е ниже в этом разделе.

Цепочки владения

Объекты последовательностей поддерживают цепочки владения. Если объект последовательности имеет того же владельца, что и вызывающие хранимая процедура, триггер или таблица (имеющая объект последовательности в качестве ограничения по умолчанию), то для объекта последовательности проверка разрешений не требуется. Если у объекта последовательности и вызывающей хранимой процедуры, триггера или таблицы разные владельцы, то для объекта последовательности требуется проверка разрешений.

Если функция NEXT VALUE FOR используется в качестве значения по умолчанию в таблице, то пользователю для вставки данных со значением по умолчанию потребуется разрешение INSERT для таблицы и разрешение UPDATE для объекта последовательности.

  • Если ограничение по умолчанию имеет того же владельца, что и объект последовательности, то при вызове ограничения по умолчанию проверка разрешений не требуется.

  • Если ограничение по умолчанию и объект последовательности принадлежат разным владельцам, то разрешения для объекта последовательности требуются даже в том случае, когда он вызывается через ограничение по умолчанию.

Audit

Для аудита функции NEXT VALUE FOR отслеживайте SCHEMA_OBJECT_ACCESS_GROUP.

Примеры

Примеры создания последовательностей и использования функции NEXT VALUE FOR для формирования порядковых номеров см. в разделе Порядковые номера.

В следующих примерах используется последовательность CountBy1 в схеме Test. Выполните следующую инструкцию, чтобы создать последовательность Test.CountBy1. В примерах В и Д используется база данных AdventureWorks2022, поэтому последовательность CountBy1 создается в ней.

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

А. Использование последовательности в инструкции SELECT

В следующем примере создается последовательность CountBy1, которая увеличивается на единицу при каждом обращении.

SELECT NEXT VALUE FOR Test.CountBy1 AS FirstUse;  
SELECT NEXT VALUE FOR Test.CountBy1 AS SecondUse;  

Вот результирующий набор.

FirstUse  
1  
 
SecondUse  
2

B. Присваивание переменной следующего значения из последовательности

Следующий пример показывает три способа присвоить переменной следующее значение последовательности.

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. Использование последовательности в ранжирующей оконной функции

USE AdventureWorks2022;  
GO  
  
SELECT NEXT VALUE FOR Test.CountBy1 OVER (ORDER BY LastName) AS ListNumber,  
    FirstName, LastName  
FROM Person.Contact ;  
GO  

D. Использование функции NEXT VALUE FOR в определении ограничения по умолчанию

Использование функции NEXT VALUE FOR поддерживается в определении ограничения по умолчанию. Пример использования функции NEXT VALUE FOR в инструкции CREATE TABLE см. в примере C Порядковые номера. В следующем примере инструкция ALTER TABLE добавляет последовательность в качестве значения по умолчанию в текущую таблицу.

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  

Е. Использование функции NEXT VALUE FOR в инструкции INSERT

В следующем примере создается таблица TestTable, а затем в нее вставляется строка с использованием функции NEXT VALUE FOR.

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  

Е. Использование функции NEXT VALUE FOR с SELECT ... В

В следующем примере инструкция SELECT ... INTO создает таблицу Production.NewLocation и вставляет в нее строки с использованием функции NEXT VALUE FOR.

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. Предоставление разрешения на выполнение NEXT VALUE FOR

В следующем примере пользователю AdventureWorks\Larry предоставляется разрешение UPDATE для выполнения функции NEXT VALUE FOR для последовательности Test.CounterSeq.

GRANT UPDATE ON OBJECT::Test.CounterSeq TO [AdventureWorks\Larry] ;  

См. также

CREATE SEQUENCE (Transact-SQL)
ALTER SEQUENCE (Transact-SQL)
Порядковые номера