テーブルから独立した採番用オブジェクトがついに登場
SQL Server 2012では、定義したルールに従って採番をするシーケンスオブジェクトが提供されています(注2)。テーブルプロパティで提供される採番用のIDENTITYと同じような機能です。
シーケンスオブジェクトとIDENTITYとの違いは、前者はテーブルから独立したオブジェクトであり、後者はテーブルの属性という点です。テーブルから独立したシーケンスオブジェクトは、ストアドプロシージャで利用できたり、テーブルのデフォルト値として、「シーケンスオブジェクトと任意の文字列」のような指定ができます。IDENTITYが設定された列は数字しか入力できませんが、シーケンスオブジェクトを使用すれば、「user0001」のような形式で採番できます。
シーケンスはSQLの標準規格であるSQL:2003で規定されたもので、すでにOracleやPostgreSQLでは提供されていました。
シーケンスオブジェクトの作成
シーケンスオブジェクトを作成する方法として、Management Studioで実施する方法とT-SQLを実行する方法があります。T-SQLを実行する場合は、リスト3のようなクエリを実行します。
1)T-SQLを利用する方法
CREATE SEQUENCE命令を利用します。リスト3は、125から採番を開始し、25ずつ増分し、最大値200に到達すると、巡回し最小値100から再度25ずつ採番していくシーケンスオブジェクトを作成します。
CREATE SEQUENCE TestSeq
AS int--シーケンスのデータ型
START WITH 125--採番を始める数字
INCREMENT BY 25 --次の採番時の増分値
MINVALUE 100--最小値
MAXVALUE 200--最大値
CYCLE --最大値を超過した場合に、例外にするか最小値から再採番するかの指定
CACHE
GO
シーケンスに使用できるデータ型には、tinyint、smallint、int、bigint、decimal(整数部のみ)、numeric(整数部のみ)、ユーザー定義データ型の7種類あります。データ型の指定を省略するとbigintが使用されます。シーケンスオブジェクトを使用する際には、必要な採番数を考慮しデータ型を選択します。表2は、それぞれのデータ型の範囲を示したものです。
| データ型 | 数値範囲 |
| tinyint | 0 ~ 255 |
| smallint | -32,768 ~ 32,767 |
| int | -2,147,483,648 ~ 2,147,483,647 |
| bigint | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
| decimal | - 10^38 +1 ~ 10^38 - 1 |
| numeric | - 10^38 +1 ~ 10^38 - 1 |
CACHEを指定すると、性能向上のために採番時にキャッシュ機能が働きます。既定では、15個キャッシュされます。例えば、クエリ3のシーケンスを初めて使用すると、125、150、175……475までメモリに展開され、475まで採番したとしてシステムテーブルに記録されます。1回で使用する採番番号が15個以上の場合、再度15個メモリにキャッシュされます。
もし、3つしか採番として使用されなかった場合は、システムテーブルの475を175に更新します。この機能により、まとめて複数採番する際の性能向上を期待できます。
NO CACHEを指定すると、性能は低下する可能性がありますが、シーケンスが使用されるたびに現在のシーケンス値がシステムテーブルに書き込まれるので、意図しない採番のずれなどが発生しなくなります。
2)Management Studioを利用する方法
Management Studioでシーケンスオブジェクトを作成するには、オブジェクトエクスプローラで、[プログラミング]-[シーケンス]を右クリックし、[新しいシーケンス]を選択します。図13のような[新しいシーケンス]ダイアログが開いたら、必要な設定をしてシーケンスオブジェクトを作成します。
シーケンスオブジェクトの使用例
シーケンスオブジェクトの使用例は、リスト4のようになります。
INSERT Test.Orders (ID, PuroductName, Detail)
VALUES (NEXT VALUE FOR Test.CountBy1, 'コーヒー', 'メーカー製品') ;
DECLARE @NextID int ;
SET @NextID = NEXT VALUE FOR Test.CountBy1;
「NEXT VALUE FOR」を使用してシーケンスオブジェクトで新し採番ができます。1つ目のクエリでは、INSERTする際に採番をしてテーブルに挿入しています。2つ目のクエリでは、変数に採番した結果を格納しています。

