レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

BLOCKVROCKリファレンス目次はこちら

SQLServerのユーザー定義テーブル値関数

ユーザー定義テーブル値関数というのをあまりよく知りませんでしたが、中々面白いもんですね。

引数を与えられるViewのようなものでしょうか。戻り値としてtable データ型を返します。

ユーザー定義テーブル値関数は、table データ型を返します。インライン テーブル値関数の場合、テーブルは単一の SELECT ステートメントの結果セットであり、関数の本体がありません。

次に、インライン テーブル値関数を作成する例を示します。この関数は、入力パラメータとして 1 つの顧客 (商店) ID を受け取り、ProductID 列と Name 列、および過去 1 年間の集計である YTD Total を商店に販売した製品ごとに返します。

USE AdventureWorks;
GO
IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL
    DROP FUNCTION Sales.ufn_SalesByStore;
GO
CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)
RETURNS TABLE
AS
RETURN 
(
    SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'YTD Total'
    FROM Production.Product AS P 
      JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
      JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
    WHERE SH.CustomerID = @storeid
    GROUP BY P.ProductID, P.Name
);
GO

次に、この関数を呼び出して顧客 ID 602 を指定する例を示します。

SELECT * FROM Sales.ufn_SalesByStore (602);

複数ステートメントを持つテーブル値関数の場合、BEGIN...END ブロックで定義される関数本体には、行を構築し、結果として返すテーブルに挿入する一連の Transact-SQL ステートメントが含まれています。

次に、テーブル値関数を作成する例を示します。この関数は、単一の入力パラメータ EmployeeID を受け取り、指定された従業員に直接または間接的に報告書を提出するすべての従業員の一覧を返します。関数が呼び出され、従業員 ID 109 を指定します。

関数の種類

何か色々使えそうですが、制約も多いのかな?