Tabulkové funkce jsou „jen“ parametrizované pohledy. Díky tomu jsou extrémně výkonné pro zapouzdření logiky, která by jinak byla skryta za neprůhlednou uloženou procedurou. Zde je příklad:
Funkce s hodnotou vložené tabulky:
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)
);
Uložená procedura:
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;
Na rozdíl od volání uložené procedury mi funkce s hodnotou tabulky umožňuje sestavit logiku z dbo.GetClients
s jinými objekty:
select *
from dbo.GetClients(N'ACME') as a
join ... as b
on a.ClientId = b.ClientId
V takových situacích si nedokážu představit použití uložené procedury, protože je omezující ve srovnání s funkcí s hodnotou tabulky. Byl bych nucen shromažďovat data kolem sebe pomocí dočasné tabulky, proměnné tabulky nebo aplikační vrstvy, abych mohl kombinovat výsledky z více objektů.
Funkce vložené tabulky s hodnotou jsou obzvláště úžasné kvůli "inline" bitu, který je pravděpodobně nejlépe vysvětlen zde. To umožňuje optimalizátoru zacházet s takovými funkcemi jinak než s objekty, které zapouzdřují, což má za následek téměř optimální plány výkonu (za předpokladu, že vaše indexy a statistiky jsou ideální).