Puede crear una función con valores de tabla (TVF) en SQL Server usando CREATE FUNCTION
Sintaxis T-SQL.
La sintaxis es ligeramente diferente dependiendo de si está creando una función con valores de tabla en línea (ITVF) o una función con valores de tabla de varias instrucciones (MSTVF).
Ejemplo 1:función con valores de tabla en línea
Este es un ejemplo de una función con valores de tabla en línea.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_ITVF(@GenreId int) RETURNS TABLE AS RETURN( SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId ); GO
Podemos decir que esta es una función con valores de tabla en línea, porque no especifica la estructura de la tabla de retorno. Simplemente indica RETURNS TABLE
, luego se basa en SELECT
instrucción para determinar la estructura de la tabla de retorno.
En este caso, la función requiere que se pase el ID del género como argumento.
Consulte Crear una función con valores de tabla en línea para ver ejemplos de cómo agregar opciones, como el enlace de esquema y el cifrado.
El enlace de esquema suele ser una buena idea, ya que evitará que se realicen cambios adversos en los objetos subyacentes a los que hace referencia la función.
Ejemplo 2:función con valores de tabla de declaraciones múltiples
Así es como escribiríamos la función si quisiéramos que fuera una función con valores de tabla de varias instrucciones.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int) RETURNS @Albums TABLE ( ArtistName nvarchar(255), AlbumName nvarchar(255), Genre nvarchar(50) ) AS BEGIN INSERT INTO @Albums SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId RETURN END GO
En este caso, usamos una variable de tipo tabla llamado @Albums
y especificamos explícitamente la estructura de la tabla de retorno. Los resultados de la consulta se almacenan en esa variable, que luego se devuelve cuando se invoca la función.
Uno de los beneficios de los MSTVF es que pueden contener varias declaraciones. Aquí está de nuevo con una parte extra añadida al final.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int) RETURNS @Albums TABLE ( ArtistName nvarchar(255), AlbumName nvarchar(255), Genre nvarchar(50) ) AS BEGIN INSERT INTO @Albums SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId IF @@ROWCOUNT = 0 BEGIN INSERT INTO @Albums VALUES ( 'None', 'None', 'None' ) END RETURN END GO
Consulte Crear una función con valores de tabla de instrucciones múltiples para obtener ejemplos de cómo agregar opciones, como el enlace de esquema y el cifrado.