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

Selecionar dados por meio de uma função com valor de tabela no SQL Server


O SELECT A instrução é provavelmente a instrução mais usada no SQL Server. Na maioria das vezes, essa instrução é executada em uma exibição ou diretamente em uma tabela para recuperar linhas de dados tabulares.

Mas visualizações e tabelas não são os únicos objetos que você pode executar um SELECT declaração em. O SELECT A instrução também pode ser usada em outros objetos, como funções de conjunto de linhas, OPENXML e funções definidas pelo usuário.

Este artigo fornece um exemplo de seleção de dados por meio de uma função com valor de tabela.


Exemplo 1 – Função básica


Aqui está uma função rápida que seleciona dados básicos de uma tabela por meio de uma função com valor de tabela embutida.
SELECT * FROM udf_Cats_ITVF();

Resultado:
+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 1       | Garfield  | 9871237654 |
| 2       | Felix     | 8871237651 |
| 3       | Tom       | 7871237652 |
| 4       | Fetch     | 6871237653 |
+---------+-----------+------------+

A função fica assim:
CREATE FUNCTION dbo.udf_Cats_ITVF()
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    );
GO

Esta função simplesmente seleciona todas as linhas de uma tabela. Não são necessários argumentos.

Se você quisesse selecionar um determinado gato, precisaria adicionar um WHERE cláusula.
SELECT * FROM udf_Cats_ITVF()
WHERE CatName = 'Fetch';

Resultado:
+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 4       | Fetch     | 6871237653 |
+---------+-----------+------------+

Agora tenho que admitir, essa função é meio supérflua, porque poderíamos ter apenas selecionado os dados diretamente da tabela. Ou poderíamos ter criado uma visão para fazer o trabalho. Mas as funções definidas pelo usuário têm um benefício que as tabelas e visualizações não têm:parâmetros.

Exemplo 2 – Função com Parâmetros


Um dos benefícios das funções com valor de tabela é que elas suportam parâmetros. É aqui que a função se torna um pouco mais útil. Alguns se referem a funções com valor de tabela como “visualizações parametrizadas”, porque elas se comportam como uma visualização, mas com a funcionalidade adicional de permitir parâmetros.

Assim, poderíamos criar uma variação da função anterior para aceitar um argumento para o nome do gato.
SELECT * FROM udf_CatsByName_ITVF('Fetch');

Resultado:
+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 4       | Fetch     | 6871237653 |
+---------+-----------+------------+

A nova função fica assim:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );

GO

Exemplo 3 – Junções


Funções com valor de tabela podem ser incluídas em junções.

Aqui, seleciono todas as colunas de uma função com valor de tabela que retorna todos os álbuns de um determinado artista:
SELECT * FROM ufn_AlbumsByArtist(1);

Resultado:
+------------+-------------------------+---------+
| ArtistId   | AlbumName               | Genre   |
|------------+-------------------------+---------|
| 1          | Powerslave              | Rock    |
| 1          | Somewhere in Time       | Rock    |
| 1          | Piece of Mind           | Rock    |
| 1          | Killers                 | Rock    |
| 1          | No Prayer for the Dying | Rock    |
+------------+-------------------------+---------+

O único problema com esta função é que ela não retorna o nome do artista. Se eu quiser o nome do artista, preciso juntá-lo com a tabela que contém esses dados. Neste caso a tabela que contém o nome do artista chama-se Artists , para que eu possa modificar minha consulta da seguinte forma:
SELECT  
    ar.ArtistName,
    aba.AlbumName,
    aba.Genre
FROM ufn_AlbumsByArtist(1) aba
INNER JOIN Artists ar
ON aba.ArtistId = ar.ArtistId;

Resultado:
+--------------+-------------------------+---------+
| ArtistName   | AlbumName               | Genre   |
|--------------+-------------------------+---------|
| Iron Maiden  | Powerslave              | Rock    |
| Iron Maiden  | Somewhere in Time       | Rock    |
| Iron Maiden  | Piece of Mind           | Rock    |
| Iron Maiden  | Killers                 | Rock    |
| Iron Maiden  | No Prayer for the Dying | Rock    |
+--------------+-------------------------+---------+