sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cuándo usaría una función con valores de tabla?

Las funciones con valores de tabla son "solo" vistas parametrizadas. Esto los hace extremadamente poderosos para encapsular lógica que de otro modo estaría oculta detrás de un procedimiento almacenado opaco. He aquí un ejemplo:

Función con valores de tabla en línea:

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

Procedimiento almacenado:

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;

A diferencia de la llamada al procedimiento almacenado, una función con valores de tabla me permite componer la lógica desde dbo.GetClients con otros objetos:

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

En tales situaciones, no puedo imaginar el uso de un procedimiento almacenado debido a lo restrictivo que es en comparación con la función con valores de tabla. Me vería obligado a ordenar los datos a mi alrededor usando una tabla temporal, una variable de tabla o una capa de aplicación para combinar los resultados de varios objetos.

Las funciones con valores de tabla en línea son especialmente impresionantes debido al bit "en línea" que probablemente se explica mejor aquí. Esto permite que el optimizador trate dichas funciones de forma similar a los objetos que encapsulan, lo que da como resultado planes de rendimiento casi óptimos (suponiendo que sus índices y estadísticas sean ideales).