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の拡張イベントについて紹介します!お楽しみに!