SQLServer2012のSQLで追加される便利な新機能4つ


2012年4月に出荷予定のSQL Server2012ではSQL文(Transact-SQL)に新しい構文が追加されます。


本記事では、SQL Server2012で新たに追加される新構文の中でも、特に便利な以下の4点を紹介します。

  • シーケンス
  • 検索結果のページング
  • EXECでプロシジャ実行時の結果セット
  • 例外処理での再スロー処理


シーケンス

データベース上でデータ一意性を確保するために、一意の連番を振りたい場合があります。
この為の機能としてシーケンスが追加されました。
シーケンスというのは、文字通り自動で連番を振る機能で、Oracleでは同じものが既に実装されています。
また、MySQLでは全く同じものではありませんが同様の機能として、AUTO_INCREMENT属性というものが有ります。


シーケンスは、CREATE SEQUENCE句を使用して、以下のSQLで事前に定義する必要があります。

CREATE SEQUENCE seq_item_id AS INT
START WITH 1
INCREMENT BY 1
MAXVALUE 10000;




実際に使用する時は、以下のように”VALUE FOR”で定義したシーケンスを指定します。

INSERT INTO ITEM_MASTER( ID ) VALUES( VALUE FOR seq_item_id );




なお、このシーケンスはトランザクションをサポートしていないため、以下のスクリプトを実行した場合でもシーケンス値は加算されることに注意が必要です。

BEGIN TRANSACTION
SELECT NEXT VALUE FOR seq_item_id;
ROLLBACK TRANSACTION





検索結果のページング

主にGUIプログラムにおいて、大量のデータを表示させる場合ページング処理を行う場合があります。
例えばgoogle検索では、のデフォルトで1ページあたり10件の検索結果を表示させ、以降のデータを見たい場合は”次ページ”をクリックさせることで、結果表示のレスポンスを向上せています。

SQLServer2012では、このページング処理を簡単に行う為にOFFEST-FETCH構文が追加されました。

SELECT *
FROM ItemMaster
ORDER BY ID
OFFSET 100 ROWS
FETCH NEXT 10 ROWS ONLY;


上記の例では、検索結果の101~110件目までの10件を取得可能です。

これはMySQLでlimit句として実装されているものと同様の機能です。


EXECでプロシジャ実行時の結果セット


SQLServer2012では、EXECステートメントでプロシジャを実行した際、プロシジャから結果セットを取得することが可能です。

例えば、以下のスクリプトをSQLServer Management Studioで実行すると、EXECの結果として結果セットが表示されます。

-- ストアドプロシジャを作成する
CREATE PROC getItemList
AS
	-- 商品マスタを返す
	SELECT id, name FROM ItemMaster;
GO
 
 
EXEC getItemList WITH RESULT SETS (
	(
		id INT,
		name VARCHAR(64)
	)
);





例外処理での再スロー処理

SQLServerのストアドプロシジャであるTransact-SQLでは、SQLServer2005以降において例外処理がサポートされています。
ただ、この例外処理はJavaやC#の様に、発生した例外ををCATCH句で再送出することが困難でした。
※厳密にはRAISEERRORで例外を再作成すれば擬似的に例外の再送出は可能でしたが、その記述は煩雑なものでした


これがSQLServer2012では、簡単に例外の再スローがTHROWの1行で可能となります。

BEGIN TRY
	BEGIN TRANSACTION
 
	SELCECT 1 / 0;   -- わざと例外を発生させる
 
	COMMIT TRANSACTION
END TRY
BEGIN CATCH
	ROLLBACK TRANSACTION
	THROW					-- THROWで、発生した例外を再送出可能
END CATCH


THROWの1行で、CATCH句で捕獲した例外を再送出できます。


こちらの記事もどうぞ:
SQL Server2012で追加される新しい組み込み関数14個

関連記事

コメントを残す

メールアドレスが公開されることはありません。