Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Quand utiliseriez-vous une fonction table ?

Les fonctions table sont "juste" des vues paramétrées. Cela les rend extrêmement puissants pour encapsuler une logique qui serait autrement cachée derrière une procédure stockée opaque. Voici un exemple :

Fonction de table en ligne :

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

Procédure stockée :

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;

Contrairement à l'appel de procédure stockée, une fonction table me permet de composer la logique à partir de dbo.GetClients avec d'autres objets :

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

Dans de telles situations, je ne peux pas imaginer utiliser une procédure stockée en raison de sa restriction par rapport à la fonction table. Je serais obligé de rassembler les données autour de moi à l'aide d'une table temporaire, d'une variable de table ou d'une couche d'application afin de combiner les résultats de plusieurs objets.

Les fonctions de table en ligne sont particulièrement impressionnantes en raison du bit "en ligne" qui est probablement mieux expliqué ici. Cela permet à l'optimiseur de traiter ces fonctions de la même manière que les objets qu'elles encapsulent, ce qui se traduit par des plans de performances presque optimaux (en supposant que vos index et statistiques sont idéaux).