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