Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wählen Sie Daten über eine Tabellenwertfunktion in SQL Server aus

Die SELECT -Anweisung ist wahrscheinlich die am häufigsten verwendete Anweisung in SQL Server. Meistens wird diese Anweisung für eine Ansicht oder direkt für eine Tabelle ausgeführt, um Zeilen mit Tabellendaten abzurufen.

Aber Ansichten und Tabellen sind nicht die einzigen Objekte, die Sie mit SELECT ausführen können Aussage an. Die SELECT -Anweisung kann auch für andere Objekte wie Rowset-Funktionen, OPENXML und benutzerdefinierte Funktionen verwendet werden.

Dieser Artikel enthält ein Beispiel für die Auswahl von Daten über eine Tabellenwertfunktion.

Beispiel 1 – Grundfunktion

Hier ist eine schnelle Funktion, die grundlegende Daten aus einer Tabelle über eine Inline-Tabellenwertfunktion auswählt.

SELECT * FROM udf_Cats_ITVF();

Ergebnis:

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

Die Funktion sieht so aus:

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

Diese Funktion wählt einfach alle Zeilen aus einer Tabelle aus. Es sind keine Argumente erforderlich.

Wenn Sie eine bestimmte Katze auswählen möchten, müssen Sie ein WHERE hinzufügen Klausel.

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

Ergebnis:

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

Nun muss ich zugeben, dass diese Funktion etwas überflüssig ist, da wir die Daten einfach direkt aus der Tabelle auswählen könnten. Oder wir hätten eine Ansicht erstellen können, um die Aufgabe zu erledigen. Aber benutzerdefinierte Funktionen haben einen Vorteil, den Tabellen und Ansichten nicht haben:Parameter.

Beispiel 2 – Funktion mit Parametern

Einer der Vorteile von Tabellenwertfunktionen besteht darin, dass sie Parameter unterstützen. Hier wird die Funktion etwas nützlicher. Einige bezeichnen Tabellenwertfunktionen als „parametrisierte Ansichten“, weil sie sich wie eine Ansicht verhalten, aber mit der zusätzlichen Funktionalität, Parameter zuzulassen.

Wir könnten also eine Variation der vorherigen Funktion erstellen, um ein Argument für den Namen der Katze zu akzeptieren.

SELECT * FROM udf_CatsByName_ITVF('Fetch');

Ergebnis:

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

Die neue Funktion sieht so aus:

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

GO

Beispiel 3 – Verknüpfungen

Tabellenwertfunktionen können in Joins eingeschlossen werden.

Hier wähle ich alle Spalten aus einer Tabellenwertfunktion aus, die alle Alben eines bestimmten Künstlers zurückgibt:

SELECT * FROM ufn_AlbumsByArtist(1);

Ergebnis:

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

Das einzige Problem bei dieser Funktion ist, dass sie den Künstlernamen nicht zurückgibt. Wenn ich den Künstlernamen möchte, muss ich ihn mit der Tabelle verbinden, die diese Daten enthält. In diesem Fall heißt die Tabelle, die den Künstlernamen enthält, Artists , also kann ich meine Abfrage wie folgt ändern:

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

Ergebnis:

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