ITコーディネータのシュウです。
いよいよ夏本番という感じになってきました。
本当に暑い日が続きますね。
そういえば、高校野球の各都道府県大会も、いよいよ佳境に入り、各地で夏の甲子園の代表校が決まってきていますが、うちの子の通っている高校も、今回は上のほうまで勝ち上がっていっているので、とっても注目していました。
暑い中、一生懸命な姿に感動しますね。なかなか忙しくて球場まで応援に行けないですが、是非、どの学校も頑張ってほしいと思います。
<本日の題材>
SEQUENCE(SQL Server)
前回、ORACLEでのSEQUENCE(順序)について取り上げましたが、今回は、SQL Serverの環境で、SEQUENCE(シーケンス)について確認してみます。
SQL Server(2012以降)でSEQUENCEを作成する構文は、ORACLEとほぼ同じで以下のようになります。
CREATE SEQUENCE [schema_name . ] sequence_name
[ AS [ built_in_integer_type | user-defined_integer_type ] ]
[ START WITH value ]
[ INCREMENT BY value ]
[ { MINVALUE value } | { NO MINVALUE } ]
[ { MAXVALUE value } | { NO MAXVALUE } ]
[ CYCLE | { NO CYCLE } ]
[ { CACHE value } | { NO CACHE } ]
前回のORACLEのときと同様、1から始まり、増分値が1、特にMAX値などは設定しない「order_sequence」という順序を作成したい場合には、以下のように作成します。
CREATE SEQUENCE dbo.order_sequence
START WITH 1
INCREMENT BY 1;
次に、ORACLEの例と同様に、値を小さくしていくSEQUENCEを作成してみます。下記は、値を小さくしていき、最小値になったら元の最大値に戻す場合の例:
CREATE SEQUENCE dbo.minus_sequence
START WITH 100000
INCREMENT BY -1
MAXVALUE 100000
MINVALUE 1
CYCLE;
SQL Server 2014 Management Studio で確認すると、シーケンスが作成されているのが確認できます。
次に、実際の使い方ですが、ORACLEではNEXTVALというものを使っていましたが、SQL Serverでは NEXT VALUE FOR 関数を使用して、次の値を取得します。
例)受注情報を登録する「受注」テーブルに、order_sequence を利用して、次の受注番号を取得して登録します。
INSERT INTO dbo.受注(受注番号,受注日,顧客番号)
VALUES(NEXT VALUE FOR order_sequence, CONVERT(VARCHAR, getdate(), 111), 'K0001037');
先ほど登録した受注データを確認します。
SELECT 受注番号, 受注日, 顧客番号
FROM 受注
WHERE 顧客番号 = 'K0001037';
もう1件登録してみます。
INSERT INTO dbo.受注(受注番号,受注日,顧客番号)
VALUES(NEXT VALUE FOR order_sequence, CONVERT(VARCHAR, getdate(), 111), 'K0001038');
受注データを確認します。
SELECT 受注番号, 受注日, 顧客番号
FROM 受注
WHERE 顧客番号 = 'K0001038';
SQL Serverでは、現在のorder_sequenceの値は、SQL Server Management Studioで確認できます。
現在値を見たいシーケンスorder_sequenceにカーソルを置いて、右ボタンでのプロパティを表示すると、
現在値が2になっていることが確認できます。
もうひとつの例として、Microsoft社のホームページに上がっていたものを参考に、テーブルの項目のデフォルト値にSEQUENCEのNEXT VALUE FOR関数を使うものを上げてみます。
まず、イベントのカウンター用のSEQUENCEを作成します。
CREATE SEQUENCE dbo.EventCounter
AS int
START WITH 1
INCREMENT BY 1 ;
次に、上記のSEQUENCEをイベントIDという項目のデフォルト値に利用したテーブルを作成します。
CREATE TABLE dbo.EventLog(
イベントID int DEFAULT (NEXT VALUE FOR EventCounter)
,イベント発生時刻 datetime NOT NULL DEFAULT (getdate())
,エラーCD varchar(20)
,イベント内容 nvarchar(256)
, CONSTRAINT PK_EventLog PRIMARY KEY (イベントID)
);
このEventLog というテーブルにデータを登録します。
INSERT dbo.EventLog(エラーCD, イベント内容)
VALUES ('EC_QCTL_20', 'SQL実行時にエラーが発生しました。') ;
INSERT dbo.EventLog(エラーCD, イベント内容)
VALUES ('EC_QSEL_2', 'クエリーの出力開始セルが正しく取得できませんでした。') ;
登録したデータを確認してみます。
SELECT * FROM dbo.EventLog
ORDER BY イベントID;
項目:イベントIDには、EventCounterシーケンスで取得された、1から1つずつ増えていく番号が設定されていることが確認できました。
今日は以上まで
にほんブログ村