SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けに、EnterpriseZine Day、Security Online Day、DataTechという、3つのイベントを開催しております。それぞれ編集部独自の切り口で、業界トレンドや最新事例を網羅。最新の動向を知ることができる場として、好評を得ています。

直近開催のイベントはこちら!

EnterpriseZine編集部ではイベントを随時開催しております

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けの講座「EnterpriseZine Academy」や、すべてのITパーソンに向けた「新エバンジェリスト養成講座」などの講座を企画しています。EnterpriseZine編集部ならではの切り口・企画・講師セレクトで、明日を担うIT人材の育成をミッションに展開しております。

お申し込み受付中!

あたらしいSQL Server/Denaliの世界

New T-SQL in Denali (後編)

#010


2. シーケンス オブジェクト

 オラクルではおなじみのシーケンス オブジェクトがついにSQL Serverでも使用できるようになります。ご存知の方も多いと思いますが、シーケンス オブジェクトはユーザーの定義に従って連番を発行してくれるオブジェクトです。

 SQL Serverでも、IDENTITY列を使用して連番を得ることが可能でしたが、アプリケーションを構築するにあたっては、IDENTITY列だけでは若干融通にかける部分がありました。皆さんは、SQL Serverを使用したアプリケーションを構築する場合、連番を管理するようなテーブルを作成して独自で連番を発行する仕組みを実装してはいなかったでしょうか?Denaliからはシーケンス オブジェクトが使用できるので、そのような手間が必要ありません。

 では、シーケンスオブジェクトの詳細をみていきましょう。シーケンスオブジェクトは、CREATE SEQUENCE文で作成します。シンタックスは以下のようになっており、開始値や増分値などが指定できます。(詳細については、こちらを参照ください)

CREATE SEQUENCE [schema_name . ] sequence_name
    [ AS [ built_in_integer_type | user-defined_integer_type ] ]
    [ START WITH <constant> ]
    [ INCREMENT BY <constant> ]
    [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
    [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
    [ CYCLE | { NO CYCLE } ]
    [ { CACHE [ <constant> ] } | { NO CACHE } ]
    [ ; ]
 

以下は、開始値が1で、増分が1のシーケンスオブジェクトを作成するときの例です。

CREATE SEQUENCE s1 AS INT
    START WITH 1
    INCREMENT BY 1;

 連番を取得するには、以下のようにNEXT VALUE FOR関数を使用します。引数には、シーケンスオブジェクトを指定します。

SELECT NEXT VALUE FOR s1 AS SEQ

[実行結果]
SEQ
-----------
1

(1 row(s) affected)
 

シーケンスオブジェクトは、以下のようにSELECT文の結果セットとともに使用することも 可能です。

/*
 連番を1から開始するように変更
*/
ALTER SEQUENCE s1 RESTART WITH 1;
GO

/*
 テスト用テーブルの作成 
 3件のデータを用意
*/
CREATE TABLE T1 (c1 CHAR(1))
GO

INSERT INTO T1 VALUES('a')
INSERT INTO T1 VALUES('b')
INSERT INTO T1 VALUES('c')
GO

/*
 結果セットに3件のデータが返され、データ件数分連番が取得される
*/
SELECT
 NEXT VALUE FOR s1 AS SEQ
,* 
FROM T1
GO

[実行結果]
SEQ         c1
----------- ----
1           a
2           b
3           c

(3 row(s) affected)

 結果セットとともに使用する場合、NEXT VALUE FOR関数には、OVER句を指定して連番を取得する順番を指定することが可能です。以下の例は、データはc1列を昇順で取得し、連番についてはc1列の降順で取得するという例です。

ALTER SEQUENCE s1 RESTART WITH 1;
GO

SELECT  
NEXT VALUE FOR s1 OVER(ORDER BY c1 DESC) AS SEQ
,*
FROM T1 
ORDER BY c1 ASC;
GO
[実行結果]
SEQ         c1
----------- ----
3           a
2           b
1           c

(3 row(s) affected)

 その他にもNEXT VALUE FOR関数は、DEFAULT制約の定義とともに使用できますし、当然のことですがINSERTステートメントとともに使用することもできます。

  このように、SQL Serverのシーケンス オブジェクトは、オラクルのシーケンス オブジェクトと似ていますが、連番を取得するためにNEXT VALUE FOR関数を使用する部分など異なる点がいくつか存在します。また、SQL Serverには、シーケンス オブジェクトに関するユーティリティとして、ユーザーが指定した任意の範囲で連番を発行してくれるストアドプロシージャ sp_sequence_get_rangeや、シーケンス オブジェクトの状態を確認できるカタログ ビュー sys.sequencesなどがあります。詳細については、こちらを参照ください。

 ***

 いかがだったでしょうか。このほかにも紹介したい機能がまだまだあります。例えば、型変換系の関数にTRY_CONVERTやTRY_PARSEといった新しい関数が追加されますし、VBでおなじみのIIF関数といった便利な関数も追加されます。興味のある方は、ぜひ弊社のサイトをいろいろ調べてみてください。

 次回は、Denaliの拡張イベントについて紹介します!お楽しみに!

この記事は参考になりましたか?

  • Facebook
  • Twitter
  • Pocket
  • note
あたらしいSQL Server/Denaliの世界連載記事一覧

もっと読む

この記事の著者

古賀 啓一郎(コガ ケイイチロウ)

日本マイクロソフト株式会社勤務。きままなエンジニア。
謎があると解決せずにはいられない性格。
週末は家事に従事。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

EnterpriseZine(エンタープライズジン)
https://enterprisezine.jp/article/detail/3591 2012/02/10 18:17

Job Board

AD

おすすめ

アクセスランキング

アクセスランキング

イベント

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けに、EnterpriseZine Day、Security Online Day、DataTechという、3つのイベントを開催しております。それぞれ編集部独自の切り口で、業界トレンドや最新事例を網羅。最新の動向を知ることができる場として、好評を得ています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング