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.