sql >> Databáze >  >> RDS >> Sqlserver

Kdy byste použili funkci s tabulkovou hodnotou?

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í).



  1. Jak aktualizovat řádky s náhodným datem

  2. PostgreSQL:ERROR:42601:pro funkce vracející záznam je vyžadován seznam definic sloupců

  3. Rozdíly mezi databázemi SQL a NoSQL – srovnání MySQL a MongoDB

  4. Výpočet vzdálenosti mezi dvěma body (zeměpisná šířka, délka)