Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Criar uma função com valor de tabela no SQL Server


Você pode criar uma função com valor de tabela (TVF) no SQL Server usando a função CREATE FUNCTION Sintaxe T-SQL.

A sintaxe é um pouco diferente dependendo se você está criando uma função com valor de tabela em linha (ITVF) ou uma função com valor de tabela de várias instruções (MSTVF).


Exemplo 1 – Função com valor de tabela embutido


Aqui está um exemplo de uma função com valor de tabela embutida.
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 dizer que esta é uma função com valor de tabela inline, porque ela não especifica a estrutura da tabela de retorno. Ele simplesmente indica RETURNS TABLE , então depende do SELECT instrução para determinar a estrutura da tabela de retorno.

Nesse caso, a função requer que o ID do gênero seja passado como argumento.

Consulte Criar uma função com valor de tabela embutida para obter exemplos de adição de opções, como associação de esquema e criptografia.

A vinculação de esquema geralmente é uma boa ideia, pois impedirá que quaisquer alterações adversas sejam feitas nos objetos subjacentes aos quais a função faz referência.

Exemplo 2 - Função com valor de tabela de várias instruções


Veja como escreveríamos a função se quiséssemos que fosse uma função com valor de tabela de várias instruções.
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

Neste caso, usamos uma variável do tipo table chamado @Albums e especificamos explicitamente a estrutura da tabela de retorno. Os resultados da consulta são armazenados nessa variável, que é retornada quando a função é invocada.

Um dos benefícios dos MSTVFs é que eles podem conter várias instruções. Aqui está novamente com uma parte extra adicionada ao 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 Criar uma função com valor de tabela de várias instruções para obter exemplos de adição de opções, como associação de esquema e criptografia.