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

Introdução às funções com valor de tabela de várias instruções (MSTVF) no SQL Server


No SQL Server, a função com valor de tabela de várias instruções é um dos dois tipos de funções com valor de tabela Transact-SQL (o outro tipo é a função com valor de tabela embutida).

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.



Os TVFs de várias instruções (às vezes chamados de MSTVFs) podem consistir em várias instruções, cujos resultados são armazenados em uma variável de retorno. Você inclui as especificações da variável de retorno na parte superior da função. Isso especifica a estrutura da tabela de retorno. Em outras palavras, você especifica quantas colunas, seus nomes, tipos de dados etc.

Isso contrasta com os TVFs embutidos (também chamados de ITVFs), que não usam uma variável de retorno (a tabela de retorno é definida pelo SELECT demonstração).

MSTVFs também usam o BEGIN /END sintaxe, que é outra coisa que os distingue dos ITVFs (os ITVFs não usam essa sintaxe).

Exemplo de uma função com valor de tabela de várias instruções


Aqui está um exemplo de um MSTVF básico:
CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70))
    RETURNS @pets TABLE (
        PetId varchar(20),
        PetName varchar(70)
    )
AS
BEGIN
    INSERT INTO @pets
    SELECT 
        CONCAT('Cat', ' ', CatId),
        CatName
    FROM dbo.Cats
    WHERE CatName = @PetName;

    INSERT INTO @pets
    SELECT 
        CONCAT('Dog', ' ', DogId),
        DogName
    FROM dbo.Dogs
    WHERE DogName = @PetName;

    IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO @pets
        VALUES (
            '',
            'There are no pets of that name.'
            )
    END

    RETURN;
END;

GO

Aqui, começo a função definindo a variável de retorno chamada @pets . É do tipo tabela , e retornará duas colunas.

Neste caso eu tenho dois SELECT instruções e um IF demonstração. Os resultados de cada um são armazenados na variável de retorno. Isso é feito através de um INSERT declaração de cada vez.

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 com vários valores para obter exemplos de adição de associação de esquema e criptografia a um ITVF.