sql >> Database teknologi >  >> RDS >> Sqlserver

Hvornår vil du bruge en funktion med tabelværdi?

Tabelvurderede funktioner er "bare" parametriserede visninger. Dette gør dem ekstremt kraftfulde til at indkapsle logik, der ellers ville være skjult bag en uigennemsigtig lagret procedure. Her er et eksempel:

Inline-tabel-vurderet funktion:

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)
);

Lagret procedure:

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;

I modsætning til det lagrede procedurekald giver en funktion med tabelværdi mig mulighed for at sammensætte logikken fra dbo.GetClients med andre objekter:

select *
from dbo.GetClients(N'ACME') as a
join ... as b
    on a.ClientId = b.ClientId

I sådanne situationer kan jeg ikke forestille mig at bruge en lagret procedure på grund af hvor restriktiv den er sammenlignet med den tabelværdisatte funktion. Jeg ville være tvunget til at samle dataene omkring mig selv ved hjælp af en midlertidig tabel, tabelvariabel eller applikationslag for at kombinere resultater fra flere objekter.

Funktioner med inline tabelværdier er især fantastiske på grund af den "inline" bit, som nok bedst forklares her. Dette gør det muligt for optimeringsværktøjet at behandle sådanne funktioner ikke anderledes end de objekter, de indkapsler, hvilket resulterer i næsten optimale ydeevneplaner (forudsat at dine indekser og statistikker er ideelle).



  1. TO_DATE() Funktion i Oracle

  2. MariaDB UNDTAGET Operatør forklaret

  3. Oracle SQL - Sådan hentes de højeste 5 værdier af en kolonne

  4. Hvordan bruger man MAX() på et underforespørgselsresultat?