テーブル型を戻り値とする関数の作成方法

プログラミング SQL Server

SQLServerでは「ユーザー定義型」と呼ばれる独自のテーブル型をした戻り値を返す関数を作成することができます。

その作り方と使い方を解説します。

スポンサーリンク

SQLServerでテーブル型を戻り値とする関数を作る

SQLServerではINT型やVARCHAR型などを返す関数と同様にユーザー定義テーブル型を戻り値とする関数を作成できます。

テーブル型を戻り値とする関数の作成

テーブル型を戻り値とする関数は通常の関数と同様にCREATE FUNCTIONで作成します。

CREATE  FUNCTION [dbo].[test_function]
(
     @param1    VARCHAR(MAX) ='' 
    ,@param2    VARCHAR(MAX) ='' 
)  
RETURNS @retTbl TABLE
(
     no   INT
    ,name VARCHAR(20)
)
BEGIN 

    INSERT INTO @retTbl VALUES( 1, '太郎' ) ;
    INSERT INTO @retTbl VALUES( 2, '次郎' ) ;
    INSERT INTO @retTbl VALUES( 3, '三郎' ) ;

    RETURN
END

通常の関数との違いは「RETURNS」に続く部分が

RETURNS @retTbl TABLE
(
     no   INT
    ,name VARCHAR(20)
)

と戻り値が呼び出し元に返したい形の
ユーザー定義テーブル型になっています。

戻り値のテーブルに値をINSERTして返します。
INSERTしない状態で関数を終了すると

     SELECT 1 AS no , '太郎' AS name
メッセージ 444、レベル 16、状態 3、プロシージャ test_function、行 13
関数内に含まれる SELECT ステートメントは、クライアントにデータを返せません。

となり、エラーで関数が作成できません。

また、最後は「RETURN」で終了している必要があります。

呼び出しかた

作成した関数を呼び出すには

SELECT * FROM  dbo.test_function( 'param1','param2' )

のようにFROM句に指定して呼び出します。

テーブルと同じ扱いです。

実行結果は

no    name
 1    太郎
 2    次郎
 3    三郎

です。

また、他のテーブルの値をSELECTして挿入することも可能です。

CREATE  FUNCTION [dbo].[test_function]
(
     @param1    VARCHAR(MAX) ='' 
    ,@param2    VARCHAR(MAX) ='' 
)  
RETURNS @retTbl TABLE
(
     no   INT
    ,name VARCHAR(20)
)
BEGIN 
    INSERT INTO @retTbl SELECT no, name FROM other_table
    RETURN
END

本来1つしか戻り値を返せない関数もこの方法を利用すれば複数行の検索結果を返す関数にすることができます。

VIEWを作成するより色々なロジックを組めるので複雑な処理が可能になります。

タイトルとURLをコピーしました