SELECT
sats är förmodligen den vanligaste satsen i SQL Server. För det mesta körs den här satsen mot en vy eller direkt mot en tabell för att hämta rader med tabelldata.
Men vyer och tabeller är inte de enda objekten du kan köra en SELECT
uttalande om. SELECT
sats kan också användas på andra objekt som raduppsättningsfunktioner, OPENXML och användardefinierade funktioner.
Den här artikeln ger ett exempel på val av data via en tabellvärderad funktion.
Exempel 1 – Grundfunktion
Här är en snabbfunktion som väljer grundläggande data från en tabell via en inline-tabellvärderad funktion.
SELECT * FROM udf_Cats_ITVF();
Resultat:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 1 | Garfield | 9871237654 | | 2 | Felix | 8871237651 | | 3 | Tom | 7871237652 | | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Funktionen ser ut så här:
CREATE FUNCTION dbo.udf_Cats_ITVF() RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats ); GO
Denna funktion väljer helt enkelt alla rader från en tabell. Inga argument krävs.
Om du vill välja en viss katt, måste du lägga till en WHERE
klausul.
SELECT * FROM udf_Cats_ITVF() WHERE CatName = 'Fetch';
Resultat:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Nu måste jag erkänna att den här funktionen är lite överflödig, eftersom vi bara kunde ha valt data direkt från tabellen. Eller så kunde vi ha skapat en vy för att göra jobbet. Men användardefinierade funktioner har en fördel som tabeller och vyer inte har:parametrar.
Exempel 2 – Funktion med parametrar
En av fördelarna med tabellvärderade funktioner är att de stöder parametrar. Det är här funktionen blir lite mer användbar. Vissa hänvisar till tabellvärdade funktioner som "parameteriserade vyer", eftersom de beter sig precis som en vy men med den extra funktionaliteten att tillåta parametrar.
Så vi kunde skapa en variant av den tidigare funktionen för att acceptera ett argument för kattens namn.
SELECT * FROM udf_CatsByName_ITVF('Fetch');
Resultat:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Den nya funktionen ser ut så här:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Exempel 3 – Går med
Tabellvärdade funktioner kan ingå i kopplingar.
Här väljer jag alla kolumner från en tabellvärderad funktion som returnerar alla album av en given artist:
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 enda problemet med den här funktionen är att den inte returnerar artistnamnet. Om jag vill ha artistnamnet måste jag sammanfoga det med tabellen som innehåller dessa data. I det här fallet kallas tabellen som innehåller artistnamnet Artists
, så jag kan ändra min fråga enligt följande:
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 | +--------------+-------------------------+---------+