2025年10月20日月曜日

SQL Serverのユーザー定義関数(UDF)まとめ|作成・利用方法と注意点

SQL Serverでは、よく使う処理をまとめて再利用できるユーザー定義関数(UDF)を作成できます。

スカラー関数やテーブル値関数を理解することで、SQLを整理し保守性を高められます。

目次

SQL Serverのユーザー定義関数の基本|再利用できる処理をまとめる方法

ユーザー定義関数とは(役割と種類)

ユーザー定義関数は、処理をひとまとめにし、呼び出し可能にする機能です。種類は以下の3つがあります。

  • スカラー関数:1つの値を返す。
  • インライン テーブル値関数(iTVF):SELECT文1本でテーブルを返す。
  • マルチステートメント TVF(MSTVF):複数の処理を含み、テーブルを返す。

スカラー関数の作成と利用方法

スカラー関数は単一値を返します。

CREATE FUNCTION dbo.Func_AddTax(@price INT)
RETURNS INT
AS
BEGIN
    RETURN @price * 110 / 100;
END;
GO

SELECT dbo.Func_AddTax(1000); -- 1100

インライン テーブル値関数の作成と利用方法

インラインTVFはビューに近い仕組みで、SELECT文をそのまま返します。

CREATE FUNCTION dbo.Func_ActiveUsers()
RETURNS TABLE
AS
RETURN (
    SELECT UserId, UserName
    FROM Users
    WHERE IsActive = 1
);
GO

SELECT * FROM dbo.Func_ActiveUsers();

マルチステートメント テーブル値関数の作成と利用方法

マルチステートメントTVFは複数処理を含めることが可能です。

CREATE FUNCTION dbo.Func_OrderSummary(@UserId INT)
RETURNS @Summary TABLE (OrderCount INT, TotalAmount INT)
AS
BEGIN
    INSERT INTO @Summary
    SELECT COUNT(*), SUM(Amount)
    FROM Orders
    WHERE UserId = @UserId;
    RETURN;
END;
GO

SELECT * FROM dbo.Func_OrderSummary(1);

DROP FUNCTIONによる削除方法

不要になった関数はDROP FUNCTIONで削除します。

DROP FUNCTION dbo.Func_AddTax;

ユーザー定義関数のパフォーマンス比較

UDFは便利ですが、種類によってパフォーマンスに大きな違いがあります。

種類特徴パフォーマンス影響実務での使いどころ
スカラー関数単一の値を返す遅い(行ごと処理、並列不可、最適化されない)小規模処理/ヘルパー的に利用
インライン テーブル値関数(iTVF)SELECT文1本で結果を返す速い(ビューと同等、最適化可能)集計や条件式の再利用に最適
マルチステートメント TVF(MSTVF)複数ステートメントで結果を構築中程度〜遅い(推定行数=1固定、プラン不安定)複雑なロジックをまとめたい場合
2019以降のスカラー関数条件次第でインライン化改善されるが制限あり最新環境なら使いやすさ向上

ユーザー定義関数の注意点と実務活用

  • 関数内では副作用のある処理(INSERT/UPDATE/DELETE)は実行できない。
  • スカラー関数はパフォーマンスに悪影響があるため、大規模データでは避ける。
  • インラインTVFは実務で最も推奨される形式。
  • 2019以降はスカラー関数のインライン化最適化が導入されて改善あり。

他のRDBとの比較(MySQL・PostgreSQL・Oracle)

  • MySQL:ストアドファンクションとして実装。
  • PostgreSQL:柔軟なユーザー定義関数をPL/pgSQLで実装可能。
  • Oracle:PL/SQLで関数を定義し、スキーマ内で利用可能。

まとめ

SQL Serverのユーザー定義関数は、スカラー・インラインTVF・マルチステートメントTVFの3種類があります。

パフォーマンスを重視する場合はインラインTVFを優先し、スカラー関数は小規模用途に限定しましょう。

2019以降はスカラー関数のインライン化も利用でき、性能面の改善が期待できます。

SQL Server 解説用イメージ

0 件のコメント:

コメントを投稿