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に置き換えてください。