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

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse 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-SQL 構文表記規則Topic 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 関数を使用するクエリや既定の制約で同じシーケンス オブジェクトが 2 回以上使用するかどうか、同じシーケンス オブジェクトは、または両方で使用される、値を提供するステートメントでと、結果セット内の行で同じシーケンスを参照するすべての列に対して実行されている既定の制約で同じ値が返されます。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 -参照されているシーケンス オブジェクトごとに、新しい値が 1 回生成、ステートメントの結果内の行ごとです。SELECT - For each referenced sequence object, a new value is generated once per row in the result of the statement.

  • INSERT ...VALUES -参照されているシーケンス オブジェクトごとに、新しい値が 1 回生成、ステートメントで挿入された行はごとです。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.

  • 手続き型ステートメント (DECLARESET など) - 参照されている各シーケンス オブジェクトに対して、ステートメントごとに新しい値が生成されます。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 or 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.

  • 次の各句で使用する場合。FETCHOVEROUTPUTONPIVOTUNPIVOTGROUP BYHAVINGCOMPUTECOMPUTE BYFOR XMLIn the following clauses: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING, COMPUTE, COMPUTE BY, or FOR XML.

  • 使用して条件付きの式で CASE, CHOOSE, COALESCE, IIF, ISNULL, or 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.

  • CHECK 制約の定義で使用する場合。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:

  • 複数のテーブル内の既定の制約から 1 つのシーケンス オブジェクトを参照できます。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 BY 句でのシーケンス オブジェクトの使用Using 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 句を使用することにより、返される値が OVER 句の ORDER BY サブ句の順序で生成されることが保証されます。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 関数の 1 つのステートメントで同じシーケンス ジェネレーター必要がありますすべてを使用してください、同じ 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 関数の 1 つのステートメントで異なるシーケンス ジェネレーターの参照を別に持つことができる OVER 句の定義。Multiple calls to the NEXT VALUE FOR function that reference different sequence generators in a single statement can have different OVER clause definitions.

  • OVER 句に適用される、 NEXT VALUE FOR 関数がサポートされていません、 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.

  • SELECT ステートメントまたは INSERT ... SELECT ... ステートメントでは、NEXT VALUE FOR 関数と共に OVER 句を使用できます。The OVER clause is allowed with the NEXT VALUE FOR function when used in a SELECT statement or INSERT ... SELECT ... statement. UPDATE ステートメントまたは MERGE ステートメントでは、NEXT VALUE FOR 関数で OVER 句は使用できません。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.

SecuritySecurity

アクセス許可Permissions

必要があります 更新 シーケンス オブジェクトまたはシーケンスのスキーマに対するアクセスを許可します。Requires UPDATE permission on the sequence object or the schema of the sequence. 権限を付与する例については、後の例 F を参照してください。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. 例 C および E では、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. SELECT ステートメントでシーケンスを使用するUsing a sequence in a select statement

次の例では、使用されるたびに 1 つずつ増加する 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.B. 変数に次のシーケンス値を設定するSetting a variable to the next sequence value

次の例では、変数にシーケンス番号の次の値を設定する 3 つの方法を示します。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.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.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. CREATE TABLE ステートメントでの NEXT VALUE FOR の使用例については、「シーケンス番号」を参照してください。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.E. INSERT ステートメントで NEXT VALUE FOR 関数を使用するUsing 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.E. SELECT ... INTO と共に NEXT VALUE FOR 関数を使用する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.F. NEXT VALUE FOR を実行する権限を付与するGranting permission to execute NEXT VALUE FOR

次の例では、Test.CounterSeq シーケンスを使用して、NEXT VALUE FOR を実行できるように、 という名前のユーザーに UPDATE AdventureWorks\Larry権限を付与します。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