Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Selezionare i dati tramite una funzione con valori di tabella in SQL Server

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