SQL Server - シーケンスを使う

SQL Serverでシーケンスを使うサンプルです。

シーケンスを久しぶりに使おうと思ったらあまり覚えておらず、以前に試したので記事が残ってるかと探してみましたが、見つからなかったのでさらっと残しておきます。

ざっくり言うとシーケンスは連番を生成するオブジェクトです。 テーブルのIDENTITY列がオブジェクトとして独立したものというと伝わるでしょうか。

使い方のポイントは2つ。

  • シーケンスオブジェクトを用意する
    • create sequence
  • シーケンスオブジェクトから連番を取得する
    • next value for関数
    • (複数の値をまとめて取得するなら)sp_sequence_get_rangeストアドプロシージャ

確認していきましょう。

シーケンスオブジェクトの作成する

create sequence文でシーケンスオブジェクトを生成します。

-- シーケンスを作成
-- as {型}
-- start with {値}: next valueを呼び出す取得できる最初の値
create sequence dbo.SQ_ItemId
    as bigint
    start with 1;

start withは連番の開始値(最初に取得できる値)を指定します。この例では1から取得できます。

シーケンスオブジェクトから連番を取得する

next value for関数(これ関数でいいのか?)を使ってシーケンスオブジェクトから連番を取得してみましょう。 以下はselect文でのサンプルですがinsert文でももちろん利用できます。

-- 次の値を取得
select next value for dbo.SQ_ItemId;

連番を範囲で取得するにはsp_sequence_get_rangeストアドプロシージャを利用します。

-- 次の値を範囲で取得
declare @name nvarchar(776) = N'dbo.SQ_ItemId';
declare @size bigint = 5;  -- 取得する数
declare @first sql_variant;  -- 最初の値
declare @increment sql_variant; -- 増分

execute sp_sequence_get_range
    @sequence_name = @name,
    @range_size = @size,
    @range_first_Value = @first output,
    @sequence_increment = @increment output;

-- @firstと@incrementがあれば取得した連番がわかるはず
select @first, @increment;

シーケンスオブジェクトは、insertする前にIDの値を把握できる点が便利だと思います。 その必要がなければIDENTITY列のほうがお手軽でしょう。 他にもメリット・デメリットがあるのでシーンによって使い分けするものかなと思います。

参考