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