NEXT VALUE FOR (Transact-SQL)NEXT VALUE FOR (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: ДаSQL Server ДаБаза данных SQL Azure НетAzure Synapse Analytics (Хранилище данных SQL) НетParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

Формирует номер последовательности из указанного объекта последовательности.Generates a sequence number from the specified sequence object.

Полное описание создания и использования последовательностей см. в разделе Последовательности чисел.For a complete discussion of both creating and using sequences, see Sequence Numbers. Используйте sp_sequence_get_range, чтобы создать резерв диапазона порядковых номеров.Use sp_sequence_get_range to generate reserve a range of sequence numbers.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

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

АргументыArguments

database_namedatabase_name
Имя базы данных, содержащей объект последовательности.The name of the database that contains the sequence object.

schema_nameschema_name
Имя схемы, содержащей объект последовательности.The name of the schema that contains the sequence object.

sequence_namesequence_name
Имя последовательности, содержащей объект, который формирует номер.The name of the sequence object that generates the number.

over_order_by_clauseover_order_by_clause
Определяет порядок, в котором значение последовательности присваивается строкам в секции.Determines the order in which the sequence value is assigned to the rows in a partition. Дополнительные сведения см. в статье Предложение OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

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

Возвращает число с использованием типа последовательности.Returns a number using the type of the sequence.

RemarksRemarks

Функция NEXT VALUE FOR может использоваться в хранимых процедурах и триггерах.The NEXT VALUE FOR function can be used in stored procedures and triggers.

Когда функция NEXT VALUE FOR используется в запросе или ограничении по умолчанию, если один и тот же объект последовательности используется несколько раз либо если один и тот же объект последовательности используется и в инструкции, поставляющей значения, и в выполняемом ограничении по умолчанию, то для всех столбцов, ссылающихся на одну последовательность в пределах строки в результирующем наборе, возвращается одно и то же значение.When the NEXT VALUE FOR function is used in a query or default constraint, if the same sequence object is used more than once, or if the same sequence object is used both in the statement supplying the values, and in a default constraint being executed, the same value will be returned for all columns referencing the same sequence within a row in the result set.

Функция NEXT VALUE FOR является недетерминированной и допустима только в тех контекстах, в которых номера из формируемой последовательности правильно определены.The NEXT VALUE FOR function is nondeterministic, and is only allowed in contexts where the number of generated sequence values is well defined. Ниже приводятся определения того, как много значений будет использовано для каждого из упоминаемых объектов последовательности в данной инструкции:Below is the definition of how many values will be used for each referenced sequence object in a given statement:

  • SELECT — для каждого указанного объекта последовательности новое значение формируется один раз для каждой строки результата выполнения инструкции.SELECT - For each referenced sequence object, a new value is generated once per row in the result of the statement.

  • INSERT ... VALUES — для каждого указанного объекта последовательности новое значение формируется один раз для каждой вставленной строки в инструкции.INSERT ... VALUES - For each referenced sequence object, a new value is generated once for each inserted row in the statement.

  • UPDATE — для каждого указанного объекта последовательности новое значение формируется один раз для каждой строки, обновляемой в инструкции.UPDATE - For each referenced sequence object, a new value is generated for each row being updated by the statement.

  • Процедурные инструкции (DECLARE, SET и т. д.) — для каждого указанного объекта последовательности новое значение формируется для каждой инструкции.Procedural statements (such as DECLARE, SET, etc.) - For each referenced sequence object, a new value is generated for each statement.

ОграниченияLimitations and Restrictions

Функция NEXT VALUE FOR не может использоваться в следующих случаях:The NEXT VALUE FOR function cannot be used in the following situations:

  • Если база данных находится в режиме только для чтения.When a database is in read-only mode.

  • В качестве аргумента функции с табличным значением.As an argument to a table-valued function.

  • В качестве аргумента агрегатной функции.As an argument to an aggregate function.

  • Во вложенных запросах, включающих обобщенные табличные выражения и производные таблицы.In subqueries including common table expressions and derived tables.

  • В представлениях, определяемых пользователем функциях, вычисляемых столбцах.In views, in user-defined functions, or in computed columns.

  • В инструкциях с операторами DISTINCT, UNION, UNION ALL, EXCEPT или INTERSECT.In a statement using the DISTINCT, UNION, UNION ALL, EXCEPT or INTERSECT operator.

  • В инструкциях с предложением ORDER BY, если не используется NEXT VALUE FOR ... OVER (ORDER BY ...).In a statement using the ORDER BY clause unless NEXT VALUE FOR ... OVER (ORDER BY ...) is used.

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

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

  • В предложении VALUES, которое не является частью инструкции INSERT.In a VALUES clause that is not part of an INSERT statement.

  • В определении проверочного ограничения.In the definition of a check constraint.

  • В определении правила или объекта "значение по умолчанию".In the definition of a rule or default object. (Может использоваться в ограничении по умолчанию.)(It can be used in a default constraint.)

  • Используется по умолчанию в определяемом пользователем типе.As a default in a user-defined table type.

  • В инструкции, в которой используется TOP или OFFSET, или при установке параметра ROWCOUNT.In a statement using TOP, OFFSET, or when the ROWCOUNT option is set.

  • В предложении WHERE инструкции.In the WHERE clause of a statement.

  • В инструкции MERGE.In a MERGE statement. (За исключением случая, когда функция NEXT VALUE FOR используется в ограничении по умолчанию в целевой таблице, а ограничение по умолчанию используется в инструкции CREATE из инструкции MERGE.)(Except when the NEXT VALUE FOR function is used in a default constraint in the target table and default is used in the CREATE statement of the MERGE statement.)

Использование объекта последовательности в ограничении по умолчаниюUsing a Sequence Object in a Default Constraint

При использовании функции NEXT VALUE FOR в ограничении по умолчанию действуют следующие правила:When using the NEXT VALUE FOR function in a default constraint, the following rules apply:

  • Один объект последовательности может указываться из ограничений по умолчанию нескольких таблиц.A single sequence object may be referenced from default constraints in multiple tables.

  • Таблица и объект последовательности должны находиться в одной и той же базе данных.The table and the sequence object must reside in the same database.

  • Пользователь, добавляющий ограничение по умолчанию, должен иметь разрешение REFERENCES для объекта последовательности.The user adding the default constraint must have REFERENCES permission on the sequence object.

  • Объект последовательности, указанный из ограничения по умолчанию, не может быть удален до тех пор, пока не удалено само ограничение по умолчанию.A sequence object that is referenced from a default constraint cannot be dropped before the default constraint is dropped.

  • Если один и тот же объект последовательности указан в нескольких ограничениях по умолчанию либо и в инструкции, поставляющей значения, и в выполняемом ограничении по умолчанию, то для всех столбцов в строке возвращается один и тот же номер последовательности.The same sequence number is returned for all columns in a row if multiple default constraints use the same sequence object, or if the same sequence object is used both in the statement supplying the values, and in a default constraint being executed.

  • В ссылке на функцию NEXT VALUE FOR в ограничении по умолчанию не может быть указано предложение OVER.References to the NEXT VALUE FOR function in a default constraint cannot specify the OVER clause.

  • Объект последовательности, указанный в ограничении по умолчанию, может быть изменен.A sequence object that is referenced in a default constraint can be altered.

  • В инструкциях INSERT ... SELECT и INSERT ... EXEC, где вставляемые данные поступают из запроса с предложением ORDER BY, значения, возвращаемые функцией NEXT VALUE FOR, будут формироваться в порядке, указанном в предложении ORDER BY.In the case of an INSERT ... SELECT or INSERT ... EXEC statement where the data being inserted comes from a query using an ORDER BY clause, the values being returned by the NEXT VALUE FOR function will be generated in the order specified by the ORDER BY clause.

Использование объекта последовательности с предложением OVER ORDER BYUsing a Sequence Object with an OVER ORDER BY Clause

Функция NEXT VALUE FOR поддерживает формирование отсортированных значений последовательности при указании предложения OVER в вызове NEXT VALUE FOR.The NEXT VALUE FOR function supports generating sorted sequence values by applying the OVER clause to the NEXT VALUE FOR call. При использовании предложения OVER пользователю гарантированно будут возвращены значения, сформированные в порядке, который определен вложенным предложением ORDER BY предложения OVER.By using the OVER clause, a user is guaranteed that the values being returned are generated in the order of the OVER clause's ORDER BY subclause. При использовании функции NEXT VALUE FOR в предложении OVER действуют следующие дополнительные правила:The following additional rules apply when using the NEXT VALUE FOR function with the OVER clause:

  • Если в одной инструкции имеется несколько вызовов функции NEXT VALUE FOR для одного и того же генератора последовательности, то все они должны иметь одно и то же определение предложения OVER.Multiple calls to the NEXT VALUE FOR function for the same sequence generator in a single statement must all use the same OVER clause definition.

  • Если в одной инструкции имеется несколько вызовов функции NEXT VALUE FOR для разных генераторов последовательностей, то они могут иметь разные определения предложения OVER.Multiple calls to the NEXT VALUE FOR function that reference different sequence generators in a single statement can have different OVER clause definitions.

  • В вызовах функции NEXT VALUE FOR с предложением OVER не поддерживается вложенное предложение PARTITION BY.An OVER clause applied to the NEXT VALUE FOR function does not support the PARTITION BY sub clause.

  • Если во всех вызовах функции NEXT VALUE FOR в инструкции SELECT указано предложение OVER, то предложение ORDER BY можно использовать в инструкции SELECT.If all calls to the NEXT VALUE FOR function in a SELECT statement specifies the OVER clause, an ORDER BY clause may be used in the SELECT statement.

  • Предложение OVER допустимо для функции NEXT VALUE FOR только в инструкциях SELECT или INSERT ... SELECT ....The OVER clause is allowed with the NEXT VALUE FOR function when used in a SELECT statement or INSERT ... SELECT ... statement. Использование предложения OVER в функции NEXT VALUE FOR не допускается в инструкции UPDATE или MERGE.Use of the OVER clause with the NEXT VALUE FOR function is not allowed in UPDATE or MERGE statements.

  • Если доступ к объекту последовательности в то же самое время производится и из другого процесса, то в возвращаемых номерах могут быть пропуски.If another process is accessing the sequence object at the same time, the numbers returned could have gaps.

МетаданныеMetadata

Чтобы получить сведения о последовательностях, запросите представление каталога sys.sequences.For information about sequences, query the sys.sequences catalog view.

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

РазрешенияPermissions

Требуется разрешение UPDATE для объекта последовательности или схемы последовательности.Requires UPDATE permission on the sequence object or the schema of the sequence. Пример предоставления разрешения см. в примере Е ниже в этом разделе.For an example of granting permission, see example F later in this topic.

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

Объекты последовательностей поддерживают цепочки владения.Sequence objects support ownership chaining. Если объект последовательности имеет того же владельца, что и вызывающие хранимая процедура, триггер или таблица (имеющая объект последовательности в качестве ограничения по умолчанию), то для объекта последовательности проверка разрешений не требуется.If the sequence object has the same owner as the calling stored procedure, trigger, or table (having a sequence object as a default constraint), no permission check is required on the sequence object. Если у объекта последовательности и вызывающей хранимой процедуры, триггера или таблицы разные владельцы, то для объекта последовательности требуется проверка разрешений.If the sequence object is not owned by the same user as the calling stored procedure, trigger, or table, a permission check is required on the sequence object.

Если функция NEXT VALUE FOR используется в качестве значения по умолчанию в таблице, то пользователю для вставки данных со значением по умолчанию потребуется разрешение INSERT для таблицы и разрешение UPDATE для объекта последовательности.When the NEXT VALUE FOR function is used as a default value in a table, users require both INSERT permission on the table, and UPDATE permission on the sequence object, to insert data using the default.

  • Если ограничение по умолчанию имеет того же владельца, что и объект последовательности, то при вызове ограничения по умолчанию проверка разрешений не требуется.If the default constraint has the same owner as the sequence object, no permissions are required on the sequence object when the default constraint is called.

  • Если ограничение по умолчанию и объект последовательности принадлежат разным владельцам, то разрешения для объекта последовательности требуются даже в том случае, когда он вызывается через ограничение по умолчанию.If the default constraint and the sequence object are not owned by the same user, permissions are required on the sequence object even if it is called through the default constraint.

АудитAudit

Для аудита функции NEXT VALUE FOR отслеживайте SCHEMA_OBJECT_ACCESS_GROUP.To audit the NEXT VALUE FOR function, monitor the SCHEMA_OBJECT_ACCESS_GROUP.

ПримерыExamples

Примеры создания последовательностей и использования функции NEXT VALUE FOR для формирования порядковых номеров см. в разделе Порядковые номера.For examples of both creating sequences and using the NEXT VALUE FOR function to generate sequence numbers, see Sequence Numbers.

В следующих примерах используется последовательность CountBy1 в схеме Test.The following examples use a sequence named CountBy1 in a schema named Test. Выполните следующую инструкцию, чтобы создать последовательность Test.CountBy1.Execute the following statement to create the Test.CountBy1 sequence. В примерах В и Д используется база данных AdventureWorks2012AdventureWorks2012, поэтому последовательность CountBy1 создается в ней.Examples C and E use the AdventureWorks2012AdventureWorks2012 database, so the CountBy1 sequence is created in that database.

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

A.A. Использование последовательности в инструкции SELECTUsing a sequence in a select statement

В следующем примере создается последовательность CountBy1, которая увеличивается на единицу при каждом обращении.The following example creates a sequence named CountBy1 that increases by one every time that it is used.

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

Результирующий набор:Here is the result set.

FirstUse  
1  
 
SecondUse  
2

Б.B. Присваивание переменной следующего значения из последовательностиSetting a variable to the next sequence value

Следующий пример показывает три способа присвоить переменной следующее значение последовательности.The following example demonstrates three ways to set a variable to the next value of a sequence number.

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

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

Г.D. Использование функции NEXT VALUE FOR в определении ограничения по умолчаниюUsing the NEXT VALUE FOR function in the definition of a default constraint

Использование функции NEXT VALUE FOR поддерживается в определении ограничения по умолчанию.Using the NEXT VALUE FOR function in the definition of a default constraint is supported. Пример использования функции NEXT VALUE FOR в инструкции CREATE TABLE см. в примере C Порядковые номера.For an example of using NEXT VALUE FOR in a CREATE TABLE statement, see Example CSequence Numbers. В следующем примере инструкция ALTER TABLE добавляет последовательность в качестве значения по умолчанию в текущую таблицу.The following example uses ALTER TABLE to add a sequence as a default to a current 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  

Д.E. Использование функции NEXT VALUE FOR в инструкции INSERTUsing the NEXT VALUE FOR function in an INSERT statement

В следующем примере создается таблица TestTable, а затем в нее вставляется строка с использованием функции NEXT VALUE FOR.The following example creates a table named TestTable and then uses the NEXT VALUE FOR function to insert a row.

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. Использование функции NEXT VALUE FOR с SELECT ... INTOUsing the NEXT VALUE FOR function with SELECT ... INTO

В следующем примере инструкция SELECT ... INTO создает таблицу Production.NewLocation и вставляет в нее строки с использованием функции NEXT VALUE FOR.The following example uses the SELECT ... INTO statement to create a table named Production.NewLocation and uses the NEXT VALUE FOR function to number each row.

USE AdventureWorks2012 ;   
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 FORGranting permission to execute NEXT VALUE FOR

В следующем примере пользователю AdventureWorks\Larry предоставляется разрешение UPDATE для выполнения функции NEXT VALUE FOR для последовательности Test.CounterSeq.The following example grants UPDATE permission to a user named AdventureWorks\Larry permission to execute NEXT VALUE FOR using the Test.CounterSeq sequence.

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

См. также:See Also

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