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

O que é uma função com valor de tabela no SQL Server?


No SQL Server, uma função com valor de tabela (TVF) é uma função definida pelo usuário que retorna uma tabela. Isso contrasta com uma função escalar, que retorna um único valor.

Você pode invocar uma função com valor de tabela da mesma forma que pode consultar uma tabela. Por exemplo, você pode usá-lo em um SELECT demonstração. Em alguns casos, as funções com valor de tabela também podem ser usadas para atualizar, excluir e inserir dados.


Tipos de funções com valor de tabela


Ao criar uma função com valor de tabela, você tem a opção de criar uma função com valor de tabela Transact-SQL ou uma função com valor de tabela CLR (Common Language Runtime).

Funções com valor de tabela Transact-SQL


Os TVFs Transact-SQL podem ser um dos seguintes:
Função com valor de tabela embutido (ITVF)
Ao criar um ITVF, você inicia a definição da função com RETURNS TABLE , e o subsequente SELECT declaração define a estrutura da tabela de retorno.
Função com valor de tabela de várias declarações (MSTVF)
Uma função com valor de tabela de várias instruções pode conter várias instruções, cujos resultados são salvos em uma variável que você declara no início da função. Ao fazer isso, você especifica explicitamente a estrutura da tabela de retorno.

Funções com valor de tabela CLR


Da perspectiva do CLR, a sintaxe é semelhante ao T-SQL ITVF, mas um pouco diferente. Você especifica explicitamente a estrutura da tabela de retorno, mas não declara uma variável de retorno.

As funções com valor de tabela CLR são implementadas como métodos em uma classe em um assembly do Microsoft .NET Framework.

Para obter uma visão geral mais detalhada de CLR TVFs, consulte a documentação da Microsoft para funções com valor de tabela CLR.

Exemplo 1 – Função com valor de tabela embutido


Aqui está um exemplo do código T-SQL usado para criar uma função com valor de tabela embutida.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );
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.

Neste caso, a função requer que o nome do gato 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 udf_CatsByName_MSTVF( @CatName varchar(70) )
    RETURNS @cats TABLE (
        CatId int,
        CatName varchar(70),
        Phone varchar(10)
    )
AS
BEGIN
    INSERT INTO @cats
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName;

    RETURN;
END;
GO

Neste caso, usamos uma variável do tipo table chamado @cats 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.

Este exemplo não faz muita justiça ao MSTVF, porque incluí apenas uma única declaração. O ponto principal dos MSTVFs é que você pode incluir várias instruções e pode adicionar a saída dessas instruções à variável de retorno.

Consulte Criar uma função com valor de tabela de várias instruções para obter um exemplo de uso de várias instruções, bem como exemplos de adição de opções, como associação de esquema e criptografia.

Exemplo 3 – Selecionar dados de nossas funções com valor de tabela


Agora que criamos nossas funções, podemos invocá-las usando um SELECT demonstração.
SELECT * FROM udf_CatsByName_ITVF('Tom');
SELECT * FROM udf_CatsByName_MSTVF('Tom');

Resultado:
+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 3       | Tom       | 7871237652 |
+---------+-----------+------------+
(1 row affected)
+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 3       | Tom       | 7871237652 |
+---------+-----------+------------+
(1 row affected)

Tanto o ITVF quanto o MSTVF foram invocados usando a mesma sintaxe e ambos retornaram o mesmo resultado.

Invocando funções com valor de tabela


Funções com valor de tabela podem ser invocadas onde expressões de tabela são permitidas no FROM cláusula de SELECT , INSERT , UPDATE , ou DELETE declarações.

Isso significa que você pode selecionar dados, inserir dados, atualizar dados e até mesmo excluir dados por meio de uma função com valor de tabela.

Aqui estão os artigos que demonstram cada um:
  • Selecionar dados por meio de uma função com valor de tabela
  • Atualizar dados por meio de uma função com valor de tabela
  • Inserir dados por meio de uma função com valor de tabela
  • Excluir dados por meio de uma função com valor de tabela