テーブル値関数は、「単なる」パラメーター化されたビューです。これにより、不透明なストアドプロシージャの背後に隠されていたロジックをカプセル化するために非常に強力になります。次に例を示します:
インラインテーブル値関数:
create function dbo.GetClients (
@clientName nvarchar(max) = null
)
returns table
return (
select *
from dbo.Clients as a
where ((a.ClientName = @clientName) or a.ClientName is null)
);
ストアドプロシージャ:
create procedure dbo.usp_GetClients (
@clientName nvarchar(max) = null
)
as
begin;
select *
from dbo.Clients as a
where ((a.ClientName = @clientName) or a.ClientName is null)
end;
ストアドプロシージャの呼び出しとは異なり、テーブル値関数を使用すると、dbo.GetClients
からロジックを作成できます。 他のオブジェクトと:
select *
from dbo.GetClients(N'ACME') as a
join ... as b
on a.ClientId = b.ClientId
このような状況では、テーブル値関数と比較した場合の制限が大きいため、ストアドプロシージャの使用を想像することはできません。複数のオブジェクトからの結果を組み合わせるために、一時テーブル、テーブル変数、またはアプリケーション層を使用して自分の周りのデータをマーシャリングすることを余儀なくされます。
インラインテーブル値関数は、おそらくここで最もよく説明されている「インライン」ビットがあるため、特に優れています。これにより、オプティマイザーはカプセル化するオブジェクトと同じようにそのような関数を処理できるため、ほぼ最適なパフォーマンスプランが得られます(インデックスと統計が理想的であると想定)。