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列のほうがお手軽でしょう。 他にもメリット・デメリットがあるのでシーンによって使い分けするものかなと思います。