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.