ROC曲線の閾値を求めるストアドプロシージャまたはインラインテーブル値関数をSQL Serverで定義するでは単一のレコードを返すストアドプロシージャ,またはインラインテーブル値関数を作成した.今回は引数の最小値と最大値を渡して複数行のレコードセットをテーブルとして返すストアドプロシージャ,またはユーザー定義のインライン関数を定義したい.
ストアドプロシージャ
下記のように記述する.
- 3行目 CREATE PROCEDURE で作成するストアドプロシージャ名を定義する.関数名の次は () で引数を指定する
- 5行目と6行目で引数とそのデータ型を定義する.引数が複数ある場合はコンマで区切る
- 8行目 AS 以下9行目の BEGIN から39行目の END までがひとまとまりである
- 10行目 DECLARE でテーブル型のローカル変数 @TmpTable を宣言する.列の定義は () 内の12行目から26行目までである
- 28行目の BEGIN から38行目の END までがひとまとまりである
- 29行目で整数型のローカル変数 @Inc を宣言し,30行目で初期化する
- 31行目の WHILE に記述した条件を満たしている間,32行目 BEGIN から35行目 END までの処理をループする.具体的には33行目でユーザー定義関数 UDF_Temperature に引数 @Inc を渡し,得られた結果を @TmpTable に挿入している
- 34行目でローカル変数 @Inc に1加算する
- ループを抜けたら36行目で @TmpTable の内容を取得する
このプロシージャでは第1引数 (@Start) が第2引数 (@End) よりも小さいことを暗黙の前提としており,逆に大きい場合,結果は0行となる.WHILE での条件判定を満たさないためである.
USE HeatStrokeDB; GO CREATE PROCEDURE SP_SET_Temperature_Death ( @Start INT, @End INT ) AS BEGIN DECLARE @TmpTable TABLE ( [閾値] INT , [a] INT , [b] INT , INT , [d] INT , [a+c] INT , [b+d] INT , [a+b] INT , INT , [N] INT , [Sensitivity] FLOAT , [Specificity] FLOAT , [1-Specificity] FLOAT , [1-Sensitivity] FLOAT , [Radius Squared] FLOAT ) BEGIN DECLARE @Inc INT SET @Inc = @Start WHILE @Inc <= @End BEGIN INSERT INTO @TmpTable SELECT * FROM dbo.UDF_Temperature_Death(@Inc) SET @Inc = @Inc + 1 END SELECT * FROM @TmpTable END END GO
上記ストアドプロシージャを実行するには下記のように記述する.
USE HeatStrokeDB; GO EXEC dbo.SP_SET_Temperature_Death @Start = 10, @End = 40
ユーザー定義のインラインテーブル値関数
インラインテーブル値関数の場合,引数の次の8行目で戻り値をデータ型および列定義とともに宣言しておくのがストアドプロシージャとの違いになる.関数本体の処理はストアドプロシージャと違いはない.
USE HeatStrokeDB; GO CREATE FUNCTION UDF_SET_Temperature_Death ( @Start INT, @End INT ) RETURNS @TmpTable TABLE ( [閾値] INT , [a] INT , [b] INT , INT , [d] INT , [a+c] INT , [b+d] INT , [a+b] INT , INT , [N] INT , [Sensitivity] FLOAT , [Specificity] FLOAT , [1-Specificity] FLOAT , [1-Sensitivity] FLOAT , [Radius Squared] FLOAT ) AS BEGIN DECLARE @Inc INT SET @Inc = @Start WHILE @Inc <= @End BEGIN INSERT INTO @TmpTable SELECT * FROM dbo.UDF_Temperature_Death(@Inc) SET @Inc = @Inc + 1 END RETURN END GO
上記の関数を実行するには下記のように記述する.
USE HeatStrokeDB; GO SELECT * FROM dbo.UDF_Temperature_Death_SET(10,40);