Il SELECT
istruzione è probabilmente l'istruzione più comunemente utilizzata in SQL Server. La maggior parte delle volte questa istruzione viene eseguita su una vista o direttamente su una tabella per recuperare righe di dati tabulari.
Ma viste e tabelle non sono gli unici oggetti su cui puoi eseguire un SELECT
dichiarazione su. Il SELECT
L'istruzione può essere utilizzata anche su altri oggetti come funzioni di set di righe, OPENXML e funzioni definite dall'utente.
Questo articolo fornisce un esempio di selezione dei dati tramite una funzione con valori di tabella.
Esempio 1 – Funzione di base
Ecco una funzione rapida che seleziona i dati di base da una tabella tramite una funzione inline con valori di tabella.
SELECT * FROM udf_Cats_ITVF();
Risultato:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 1 | Garfield | 9871237654 | | 2 | Felix | 8871237651 | | 3 | Tom | 7871237652 | | 4 | Fetch | 6871237653 | +---------+-----------+------------+
La funzione si presenta così:
CREATE FUNCTION dbo.udf_Cats_ITVF() RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats ); GO
Questa funzione seleziona semplicemente tutte le righe da una tabella. Non sono richiesti argomenti.
Se desideri selezionare un determinato gatto, devi aggiungere un WHERE
clausola.
SELECT * FROM udf_Cats_ITVF() WHERE CatName = 'Fetch';
Risultato:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Ora devo ammettere che questa funzione è un po' superflua, perché avremmo potuto semplicemente selezionare i dati direttamente dalla tabella. Oppure avremmo potuto creare una vista per fare il lavoro. Ma le funzioni definite dall'utente hanno un vantaggio che le tabelle e le viste non hanno:i parametri.
Esempio 2 – Funzione con parametri
Uno dei vantaggi delle funzioni con valori di tabella è che supportano i parametri. È qui che la funzione diventa un po' più utile. Alcuni si riferiscono alle funzioni con valori di tabella come "viste parametrizzate", perché si comportano proprio come una vista ma con la funzionalità aggiuntiva di consentire i parametri.
Quindi potremmo creare una variazione della funzione precedente per accettare un argomento per il nome del gatto.
SELECT * FROM udf_CatsByName_ITVF('Fetch');
Risultato:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 4 | Fetch | 6871237653 | +---------+-----------+------------+
La nuova funzione si presenta così:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Esempio 3 – Join
Le funzioni con valori di tabella possono essere incluse nei join.
Qui, seleziono tutte le colonne da una funzione con valori di tabella che restituisce tutti gli album di un determinato artista:
SELECT * FROM ufn_AlbumsByArtist(1);
Risultato:
+------------+-------------------------+---------+ | 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 | +------------+-------------------------+---------+
L'unico problema con questa funzione è che non restituisce il nome dell'artista. Se voglio il nome dell'artista, devo unirlo alla tabella che contiene quei dati. In questo caso la tabella che contiene il nome dell'artista si chiama Artists
, quindi posso modificare la mia query come segue:
SELECT ar.ArtistName, aba.AlbumName, aba.Genre FROM ufn_AlbumsByArtist(1) aba INNER JOIN Artists ar ON aba.ArtistId = ar.ArtistId;
Risultato:
+--------------+-------------------------+---------+ | 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 | +--------------+-------------------------+---------+