SQL Server開発の利便性を向上させるFileTable/シーケンスオブジェクト/ページング機能
進化したSQL Server 2012の新機能紹介(4)
ダウンロード サンプルファイル (460.3 KB)
テーブルから独立した採番用オブジェクトがついに登場
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つ目のクエリでは、変数に採番した結果を格納しています。
この記事は参考になりましたか?
- 進化したSQL Server 2012の新機能紹介連載記事一覧
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 大和屋 貴仁(ヤマトヤ タカヒト)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア

