sql >> Database >  >> RDS >> Sqlserver

Wanneer zou u een functie met tabelwaarde gebruiken?

Functies met tabelwaarde zijn "slechts" geparametriseerde weergaven. Dit maakt ze extreem krachtig voor het inkapselen van logica die anders verborgen zou zijn achter een ondoorzichtige opgeslagen procedure. Hier is een voorbeeld:

Inline functie met tabelwaarde:

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

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

In tegenstelling tot de opgeslagen procedure-aanroep, kan ik met een functie met tabelwaarde de logica samenstellen uit dbo.GetClients met andere objecten:

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

In dergelijke situaties kan ik me niet voorstellen dat ik een opgeslagen procedure zou gebruiken vanwege de restrictie in vergelijking met de functie met tabelwaarde. Ik zou gedwongen zijn om de gegevens om mezelf heen te rangschikken met behulp van een tijdelijke tabel, tabelvariabele of applicatielaag om resultaten van meerdere objecten te combineren.

Functies met inline-tabelwaarde zijn vooral geweldig vanwege het "inline"-bit dat hier waarschijnlijk het beste kan worden uitgelegd. Hierdoor kan de optimizer dergelijke functies niet anders behandelen dan de objecten die ze bevatten, wat resulteert in bijna optimale prestatieplannen (ervan uitgaande dat uw indexen en statistieken ideaal zijn).



  1. T-SQL SET-operators Deel 2:INTERSECT en BEHALVE

  2. MySQL-fout 1449:de gebruiker die is opgegeven als definitie bestaat niet

  3. Hoe gebruik je WebDev.WebServer.exe (VS Web Server) in x64?

  4. Hoe de waarden van identiteitskolommen programmatisch te wijzigen?