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

Crear una función con valores de tabla en SQL Server

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.