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