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

Vælg data via en funktion med tabelværdi i SQL Server

SELECT sætning er sandsynligvis den mest almindeligt anvendte sætning i SQL Server. Det meste af tiden køres denne sætning mod en visning eller direkte mod en tabel for at hente rækker af tabeldata.

Men visninger og tabeller er ikke de eneste objekter, du kan køre en SELECT erklæring vedr. SELECT sætning kan også bruges på andre objekter såsom rækkesætfunktioner, OPENXML og brugerdefinerede funktioner.

Denne artikel giver et eksempel på valg af data via en funktion med tabelværdi.

Eksempel 1 – Grundlæggende funktion

Her er en hurtig funktion, der vælger grundlæggende data fra en tabel via en indlejret tabelværdi-funktion.

SELECT * FROM udf_Cats_ITVF();

Resultat:

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

Funktionen ser således ud:

CREATE FUNCTION dbo.udf_Cats_ITVF()
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    );
GO

Denne funktion vælger ganske enkelt alle rækker fra en tabel. Der kræves ingen argumenter.

Hvis du vil vælge en bestemt kat, skal du tilføje en WHERE klausul.

SELECT * FROM udf_Cats_ITVF()
WHERE CatName = 'Fetch';

Resultat:

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

Nu må jeg indrømme, at denne funktion er lidt overflødig, for vi kunne bare have valgt dataene direkte fra tabellen. Eller vi kunne have skabt en udsigt til at udføre jobbet. Men brugerdefinerede funktioner har en fordel, som tabeller og visninger ikke har:parametre.

Eksempel 2 – Funktion med parametre

En af fordelene ved tabelværdierede funktioner er, at de understøtter parametre. Det er her, funktionen bliver en smule mere anvendelig. Nogle omtaler tabelværdierede funktioner som "parameteriserede visninger", fordi de opfører sig ligesom en visning, men med den tilføjede funktionalitet at tillade parametre.

Så vi kunne oprette en variation af den tidligere funktion for at acceptere et argument for kattens navn.

SELECT * FROM udf_CatsByName_ITVF('Fetch');

Resultat:

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

Den nye funktion ser således ud:

CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );

GO

Eksempel 3 – Deltager

Tabelvurderede funktioner kan indgå i joinforbindelser.

Her vælger jeg alle kolonner fra en funktion med tabelværdi, der returnerer alle albums af en given kunstner:

SELECT * FROM ufn_AlbumsByArtist(1);

Resultat:

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

Det eneste problem med denne funktion er, at den ikke returnerer kunstnernavnet. Hvis jeg vil have kunstnernavnet, skal jeg forbinde det med tabellen, der indeholder disse data. I dette tilfælde kaldes tabellen, der indeholder kunstnernavnet, Artists , så jeg kan ændre min forespørgsel som følger:

SELECT  
    ar.ArtistName,
    aba.AlbumName,
    aba.Genre
FROM ufn_AlbumsByArtist(1) aba
INNER JOIN Artists ar
ON aba.ArtistId = ar.ArtistId;

Resultat:

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

  1. Sådan bruges "Like" i SQL

  2. Nedetid og Hotpatch-anvendelsestilstand i adop R12.2

  3. Sådan aktiverer du SSL/TLS til MySQL i Ubuntu

  4. 3 måder at udtrække året fra en dato i SQL Server (T-SQL)