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.