No SQL Server, a função com valor de tabela embutido é um dos dois tipos de funções com valor de tabela Transact-SQL (o outro tipo é a função com valor de tabela de várias instruções).
Funções com valor de tabela (TVF) são um tipo de função definida pelo usuário que retorna seus resultados como uma tabela. Eles podem, portanto, ser consultados como uma tabela normal.
TVFs embutidos (às vezes chamados de ITVFs) não possuem variáveis de retorno associadas. O valor de retorno é definido por meio de um único
SELECT
demonstração. Esta instrução define a estrutura da tabela de retorno. Isso contrasta com os TVFs de várias instruções (também chamados de MSTVFs), que exigem uma variável de retorno. ITVFs também não usam o
BEGIN
/END
sintaxe, que é outra coisa que os distingue dos MSTVFs. Os TVFs inline geralmente são considerados como tendo melhor desempenho em relação aos TVFs de várias instruções, embora isso também dependa do que você está tentando fazer na função.
Exemplo de uma função com valor de tabela embutido
Aqui está um exemplo de um ITVF básico:
CREATE FUNCTION dbo.ufn_AlbumsByArtist(@ArtistId int) RETURNS TABLE AS RETURN ( SELECT al.ArtistId, al.AlbumName, g.Genre FROM dbo.Albums al INNER JOIN dbo.Artists ar ON al.ArtistId = ar.ArtistId INNER JOIN Genres g ON al.GenreId = g.GenreId WHERE al.ArtistId = @ArtistId ); GO
Basicamente consiste em um
SELECT
declaração encapsulada dentro de algum outro código. Para torná-lo especificamente um inline TVF, iniciei a função com RETURNS TABLE
, seguido de perto por RETURN
, e terminando com um SELECT
declaração entre parênteses. Declarações múltiplas
Embora as funções com valor de tabela inline não sejam projetadas para vários
SELECT
declarações (é para isso que servem os MSTVFs), é possível usar o UNION
operador para combinar o conjunto de resultados de várias instruções. Exemplo:
CREATE FUNCTION [dbo].[udf_PetsByName_ITVF]( @PetName varchar(70)) RETURNS TABLE AS RETURN ( SELECT CONCAT('Cat', ' ', CatId) AS PetId, CatName FROM dbo.Cats WHERE CatName = @PetName UNION ALL SELECT CONCAT('Dog', ' ', DogId) AS PetId, DogName FROM dbo.Dogs WHERE DogName = @PetName ); GO
Opções de função
Você também pode especificar coisas como usar ou não a ligação de esquema (você provavelmente deveria) e se deve ou não criptografar a função.
A associação de esquema impedirá que quaisquer alterações adversas sejam feitas nos objetos subjacentes dos quais a função depende (como descartar uma tabela, alterar uma coluna etc.).
A criptografia converterá a definição da função em um formato ofuscado (para evitar que outras pessoas possam lê-la).
Consulte Criar uma função com valor de tabela embutida para obter exemplos de como adicionar associação de esquema e criptografia a um ITVF.