前回の続き
今回はストアドプロシージャの説明です。
ストアドプロシージャ
ストアドプロシージャとは、処理をまとめてひとつにして保存するものです。
前回まで、複数の処理を重ねて処理する例をたくさんやってきましたが、それらを実行するたびにコードにおこしていたのでは大変ですよね。
そんなときに解決してくれるものです。
使い方は処理の前に以下を記述するだけです。
CREATE PROCEDURE [ストアドプロシージャの名称] [引数][データ型], [引数][データ型], ・・・ AS
あとは上記いかに必要な処理を書いていくだけです。
ちなみに、作成済みストアドプロシージャを変更する際は、CREATEをALTERにするだけです。
こんなかんじ
ALTER PROCEDURE [ストアドプロシージャの名称] [引数][データ型], [引数][データ型], ・・・ AS
実際に試してみる
前回の処理に対して1点だけ変更を加えてをストアドプロシージャに保存してみます。
(引数に@PersonTypeを指定して、カーソルに格納するためのSELECT文のWHERE句に指定してあげることにしました。)
こんなかんじ
CREATE PROCEDURE TEST_PROCEDURE @PersonType NVARCHAR(2) AS IF OBJECT_ID(N'tempdb..#TEMP_TABLE', N'U') IS NOT NULL DROP TABLE #TEMP_TABLE CREATE TABLE #TEMP_TABLE( ID INT Primary Key, FULLNAME NVARCHAR(128), NAME_LENGTH INT, MAX_LENGTH BIT ) DECLARE @ID INT DECLARE @F_NAME NVARCHAR(32) DECLARE @M_NAME NVARCHAR(32) DECLARE @L_NAME NVARCHAR(32) DECLARE @MAX_LENGTH INT SET @MAX_LENGTH = 0 DECLARE crTest CURSOR FOR SELECT BusinessEntityID, FirstName, MiddleName, LastName FROM Person.Person WHERE PersonType = @PersonType OPEN crTest FETCH NEXT FROM crTest INTO @ID, @F_NAME, @M_NAME, @L_NAME WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO #TEMP_TABLE VALUES( @ID, @F_NAME + ' ' + ISNULL(@M_NAME,'') + ' ' + @L_NAME, LEN(@F_NAME) + LEN(ISNULL(@M_NAME,'')) + LEN(@L_NAME), 'false' ) IF LEN(@F_NAME) + LEN(ISNULL(@M_NAME,'')) + LEN(@L_NAME) > @MAX_LENGTH SET @MAX_LENGTH = LEN(@F_NAME) + LEN(ISNULL(@M_NAME,'')) + LEN(@L_NAME) FETCH NEXT FROM crTest INTO @ID, @F_NAME, @M_NAME, @L_NAME END CLOSE crTest DEALLOCATE crTest UPDATE #TEMP_TABLE SET MAX_LENGTH = 'true' WHERE NAME_LENGTH = @MAX_LENGTH SELECT * FROM #TEMP_TABLE ORDER BY 4 desc
作成したストアドプロシージャはオブジェクトエクスプローラーで存在を確認できます。
ちなみにここから変更ボタンをおすとALTER PROCEDUREで開いてくれるので便利です。
実行してみる
保存されたストアドプロシージャは以下のように実行できます。
EXEC [dbo].[TEST_PROCEDURE] 'EM'
最後の’EM’は引数に対して、値を指定してあげています。
今回はWHERE句に代入される値ということになりますね。
結果はこんな感じ。
以上、今回はここまで。