sql >> Databasteknik >  >> RDS >> Sqlserver

Välj Data via en tabellvärderad funktion i SQL Server

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

  1. PostgreSQL Väljer senaste posten för ett givet ID

  2. SQL Server 2012 frågar Access 2007-data med OPENROWSET-fel

  3. Planetarisk inriktning

  4. ALTER TABLE-satsen stod i konflikt med FOREIGN KEY-begränsningen