Fungsi bernilai tabel adalah tampilan parameter "hanya". Hal ini membuat mereka sangat kuat untuk merangkum logika yang seharusnya tersembunyi di balik prosedur tersimpan buram. Ini contohnya:
Fungsi Bernilai Tabel Sebaris:
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)
);
Prosedur Tersimpan:
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;
Tidak seperti panggilan prosedur tersimpan, fungsi bernilai tabel memungkinkan saya untuk menyusun logika dari dbo.GetClients
dengan objek lain:
select *
from dbo.GetClients(N'ACME') as a
join ... as b
on a.ClientId = b.ClientId
Dalam situasi seperti itu saya tidak dapat membayangkan menggunakan prosedur tersimpan karena betapa terbatasnya jika dibandingkan dengan fungsi bernilai tabel. Saya akan dipaksa untuk menyusun data di sekitar saya menggunakan tabel sementara, variabel tabel, atau lapisan aplikasi untuk menggabungkan hasil dari beberapa objek.
Fungsi bernilai tabel sebaris sangat mengagumkan karena bit "sebaris" yang mungkin paling baik dijelaskan di sini. Hal ini memungkinkan pengoptimal untuk memperlakukan fungsi tersebut tidak berbeda dengan objek yang mereka enkapsulasi, sehingga menghasilkan rencana kinerja yang mendekati optimal (dengan asumsi bahwa indeks dan statistik Anda ideal).