sql >> Database >  >> RDS >> Sqlserver

Selecteer gegevens via een functie met tabelwaarde in SQL Server

De SELECT statement is waarschijnlijk het meest gebruikte statement in SQL Server. Meestal wordt deze instructie uitgevoerd tegen een weergave of direct tegen een tabel om rijen met tabelgegevens op te halen.

Maar views en tabellen zijn niet de enige objecten die u kunt uitvoeren met een SELECT verklaring op. De SELECT statement kan ook worden gebruikt voor andere objecten, zoals rowset-functies, OPENXML en door de gebruiker gedefinieerde functies.

Dit artikel geeft een voorbeeld van het selecteren van gegevens via een functie met tabelwaarde.

Voorbeeld 1 – Basisfunctie

Hier is een snelle functie die basisgegevens uit een tabel selecteert via een inline tabelwaardefunctie.

SELECT * FROM udf_Cats_ITVF();

Resultaat:

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

De functie ziet er als volgt uit:

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

Deze functie selecteert eenvoudig alle rijen uit een tabel. Er zijn geen argumenten nodig.

Als je een bepaalde kat wilt selecteren, moet je een WHERE . toevoegen clausule.

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

Resultaat:

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

Nu moet ik toegeven dat deze functie een beetje overbodig is, omdat we de gegevens gewoon rechtstreeks uit de tabel hadden kunnen selecteren. Of we hadden een uitzicht kunnen creëren om het werk te doen. Maar door de gebruiker gedefinieerde functies hebben een voordeel dat tabellen en weergaven niet hebben:parameters.

Voorbeeld 2 – Functie met parameters

Een van de voordelen van functies met tabelwaarde is dat ze parameters ondersteunen. Dit is waar de functie een beetje nuttiger wordt. Sommige verwijzen naar functies met tabelwaarde als "geparametriseerde weergaven", omdat ze zich net als een weergave gedragen, maar met de toegevoegde functionaliteit om parameters toe te staan.

We zouden dus een variatie op de vorige functie kunnen maken om een ​​argument voor de naam van de kat te accepteren.

SELECT * FROM udf_CatsByName_ITVF('Fetch');

Resultaat:

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

De nieuwe functie ziet er als volgt uit:

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

GO

Voorbeeld 3 – Meedoen

Functies met tabelwaarde kunnen in joins worden opgenomen.

Hier selecteer ik alle kolommen van een functie met tabelwaarde die alle albums van een bepaalde artiest retourneert:

SELECT * FROM ufn_AlbumsByArtist(1);

Resultaat:

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

Het enige probleem met deze functie is dat de naam van de artiest niet wordt geretourneerd. Als ik de artiestennaam wil, moet ik deze samenvoegen met de tabel die die gegevens bevat. In dit geval heet de tabel met de artiestennaam Artists , zodat ik mijn vraag als volgt kan wijzigen:

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

Resultaat:

+--------------+-------------------------+---------+
| 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. ORA-38868

  2. Hoe MySQL op de juiste manier met UTF-8 omgaat?

  3. Hoe twee schema's in PostgreSQL te vergelijken?

  4. MySQL 'user_id' in waar clausule dubbelzinnig probleem is