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 subsequenteSELECT
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