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.