はじめに
今携わっているプロジェクトではRDBMSはSQL ServerでTransact-SQLを使いストアドプロシージャを作成しています。ストアドを作っていく中で、「あれ、これってどういう風に書いたらいいんだろう?」とか「デバッグの仕方わかんねー!」などあり、調べてわかったことがチョコチョコ出てきたので、ここにまとめようと思います。
あと、SQL Server, SQL Server Management Studioを触って気づいたこともメモっていこうと思います
ストアドプロシージャ
基本構文系
カーソル使ってループをまわす
DECLARE <cursor name> CURSOR FOR
SELECT
hoge
FROM
HOGE_TABLE
OPEN <cursor name>
FETCH NEXT FROM <cursor name> into @hoge
WHILE @@FETCH_STATUS = 0
BEGIN
・・・ ↓がBEGIN~ENDの最終行
FETCH NEXT FROM <cursor name> into @hoge
END
上記だと、HOGE_TABLEに入っているhogeを順番に取得して@hogeの中に詰め込むことができます。
ただ、下のような書き方だと上手くループしませんでした。(取得できる行数が1行としたときに、何故かループが2回まわる) 原因分かる方がいたら教えてください
DECLARE <cursor name> CURSOR FOR
SELECT
hoge
FROM
HOGE_TABLE
OPEN <cursor name>
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM <cursor name> into @hoge
・・・ ↑がBEGIN~ENDの最初の行
END
デバッグ系
ストアド内で使っている一時テーブルの中身を見る
そういう時は、tempdbに突っ込んでおくと良さ気
見終わったら削除を忘れずに・・・
SELECT * INTO tempdb.dbo.temp_table FROM #temp_talbe;
ちなみに、Management Studioを使っているなら普通にSELECT文を書けばコンソールに吐き出してくれます。なので、下記のようにするとエラーも見れます。
TRY・・・CATCH構文でキャッチしたエラーを見る
・・・
BEGIN TRY
・・・
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH