SQLServerのストアドプロシージャ 基礎の基礎2 | おーう なんじゃそら

SQLServerのストアドプロシージャ 基礎の基礎2


前回のまとめと追記


プロシージャは、処理を登録するもので

SQLServer内でコンパイル済みのプログラムとなるようなもの。


なので、編集時はメモ帳に上書き保存するような感覚ではなく

この処理にコンパイルし直すという感じで考える。



<作成基礎>


プロシージャの作成

 CREATE PROCEDURE [プロシージャ名]

  [引数]

 AS

  [処理]


プロシージャの変更

 ALTER PROCEDURE [プロシージャ名]

  [引数]

 AS

  [処理]




<文法基礎>


変数の宣言

 DECLARE @[変数名] [型]


変数への値の挿入

 SELECT @[変数名] = [値]


一行コメント

 --コメント


複数行コメント

 /*

 コメント

 コメント

 */



ここまでがこの間やったやつ・・・?

次に、プログラムと言えば必ずある

条件分岐繰り返し処理


条件分岐

 IF [条件式]

  BEGIN

   --真の時の処理

  END

 ELSE

  BEGIN

   --偽の時の処理

  END


  ※BEGIN~ENDは、処理が複数行にまたがる時は必ず必要。

   とりあえず書いとく癖をつけておけばいい。


  (注意)多分岐はできない。 ELSE IF [条件式] というような書き方が出来ると期待してもダメ。

      IFを入れ子にして頑張る。


繰り返し

 WHILE [繰り返し条件]

  BEGIN

   --繰り返し行う処理

  END




んで、次にカーソルというものを。

これ、まだよくわかっていないのですが、添え字みたいなものだと解釈しています

テーブルのデータを一行ずつ見ていくことが出来る代物。

まずは基礎↓


カーソルの定義
 DECLARE [カーソル名] CURSOR FOR [Select文]


カーソルの開始

 OPEN [カーソル名]


カーソルの移動とデータの取得

 FETCH NEXT FROM [カーソル名] INTO @[変数名]


カーソルの終了(後処理)

 CLOSE [カーソル名]

 DEALLOCATE [カーソル名]



(利用例)
テーブルA

番号 名前 読み
1 Jon ジョン
2 Tom トム
3 True トゥルー
4 Carry キャリー
5 Risa リサ
6 Arice アリス
7 Ben ベン



CREATE PROCEDURE pro1

AS


DECLARE @no int

DECLARE @yomi nvarchar(50)



--「e」のつく名前の人だけに絞り込み、番号と読みだけ表示

DECLARE myCursor CURSOR FOR SELECT 番号, 読み FROM テーブルA WHERE 名前 LIKE '%e%'

OPEN myCursor


--一行取り出して、変数に挿入

FETCH NEXT FROM myCursor INTO @no, @yomi


WHILE @@FETCH_STATUS = 0

  BEGIN

     --表示する

    PRINT CAST(@no as nvarchar) + '番:' + @yomi

     --カーソルを次へ移動

    FETCH NEXT FROM myCursor INTO @no, @yomi

  END


CLOSE myCursor

DEALLOCATE myCursor



<実行結果>

  3番:トゥルー

  6番:アリス

  7番:ベン



少し見慣れないモノが出てるので色をつけてみました

@@FETCH_STATUS  CAST


まず@@FETCH_STATUSとは、カーソルが移動したとき、移動先のカーソルの状態を示します。

0が正常にカーソルを移動した場合。

つまり、データが見つかったということです。

上の処理では、データがある間繰り返して~ということ。


次にCASTは、キャスト。

変数の @no はint型で、文字列と連結しようとするとエラーが出ます。

数値に文字列を足せませんよ!と。

なので、数値を文字列に変えてから繋げる必要があります。

文法は

  CAST([値] as [型])




とりあえず今回はこんなもんでしょうか。


※インデントに全角スペースを使用しています。

このままコピペして実行しようとするとエラーになるので、インデントを削除するかTabに置き換えてください。