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 件のコメント:
コメントを投稿