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)