En SQL Server, la función con valores de tabla en línea es uno de los dos tipos de funciones con valores de tabla de Transact-SQL (el otro tipo es la función con valores de tabla de instrucciones múltiples).
Las funciones con valores de tabla (TVF) son un tipo de función definida por el usuario que devuelve sus resultados en forma de tabla. Por lo tanto, se pueden consultar como una tabla normal.
Los TVF en línea (a veces denominados ITVF) no tienen variables de retorno asociadas. El valor de retorno se define a través de un solo SELECT declaración. Esta sentencia define la estructura de la tabla de retorno. Esto contrasta con los TVF de varias instrucciones (también denominados MSTVF), que requieren una variable de retorno.
Las ITVF tampoco utilizan el BEGIN /END sintaxis, que es otra cosa que los distingue de los MSTVF.
A menudo se considera que los TVF en línea tienen un mejor rendimiento que los TVF de varias declaraciones, aunque esto también dependerá de lo que intente hacer en la función.
Ejemplo de una función con valores de tabla en línea
Aquí hay un ejemplo de una ITVF básica:
CREATE FUNCTION dbo.ufn_AlbumsByArtist(@ArtistId int)
RETURNS TABLE
AS
RETURN (
SELECT
al.ArtistId,
al.AlbumName,
g.Genre
FROM dbo.Albums al
INNER JOIN dbo.Artists ar
ON al.ArtistId = ar.ArtistId
INNER JOIN Genres g
ON al.GenreId = g.GenreId
WHERE al.ArtistId = @ArtistId
);
GO
Básicamente consiste en un SELECT declaración envuelta dentro de algún otro código. Para convertirlo específicamente en en línea TVF, inicié la función con RETURNS TABLE , seguido de cerca por RETURN , y terminando con un SELECT declaración entre paréntesis.
Declaraciones múltiples
Aunque las funciones con valores de tabla en línea no están diseñadas para múltiples SELECT declaraciones (para eso están los MSTVF), es posible usar el UNION operador para combinar el conjunto de resultados de varias declaraciones.
Ejemplo:
CREATE FUNCTION [dbo].[udf_PetsByName_ITVF]( @PetName varchar(70))
RETURNS TABLE
AS
RETURN (
SELECT
CONCAT('Cat', ' ', CatId) AS PetId,
CatName
FROM dbo.Cats
WHERE CatName = @PetName
UNION ALL
SELECT
CONCAT('Dog', ' ', DogId) AS PetId,
DogName
FROM dbo.Dogs
WHERE DogName = @PetName
);
GO
Opciones de funciones
También puede especificar cosas como si usar o no el enlace de esquema (probablemente debería) y si cifrar o no la función.
El enlace de esquema evitará que se realicen cambios adversos en los objetos subyacentes de los que depende la función (como eliminar una tabla, modificar una columna, etc.).
El cifrado convertirá la definición de la función a un formato ofuscado (para evitar que otros puedan leerlo).
Consulte Crear una función con valores de tabla en línea para ver ejemplos de cómo agregar enlace de esquema y cifrado a un ITVF.