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

Introdução às funções com valor de tabela em linha (ITVF) no SQL Server


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.