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


NEXT VALUE FOR (Transact-SQL)

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

Полное описание создания и использования последовательностей см. в разделе Порядковые номера. Процедура 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 ... VALUES — для каждого указанного объекта последовательности новое значение формируется один раз для каждой вставленной строки в инструкции.

  • 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 …. Функция NEXT VALUE FOR недопустима в инструкциях UPDATE и MERGE.

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

Метаданные

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

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

Разрешения

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

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

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

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

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

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

Аудит

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

Примеры

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

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

USE AdventureWorks2012 ;
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

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

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

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

В.Использование последовательности в ранжирующей оконной функции

USE AdventureWorks2012 ;
GO

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

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

Поддерживается использование функции NEXT VALUE FOR в определении ограничения по умолчанию. Пример использования функции NEXT VALUE FOR в инструкции CREATE TABLE см. в примере В разделаПорядковые номера. В следующем примере инструкция 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… INTO

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

USE AdventureWorks2012 ; 
GO

SELECT NEXT VALUE FOR Test.CountBy1 AS LocNumber, Name 
    INTO Production.NewLocation
    FROM Production.Location ;
GO

SELECT * FROM Production.NewLocation ;
GO

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

Основные понятия

Порядковые номера