複数行のレコードセットをテーブルとして返すストアドプロシージャまたはユーザー定義のインラインテーブル値関数をSQL Serverで定義する

 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);

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください