Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Sélectionner des données via une fonction table dans SQL Server

Le SELECT est probablement l'instruction la plus couramment utilisée dans SQL Server. La plupart du temps, cette instruction est exécutée sur une vue ou directement sur une table pour récupérer des lignes de données tabulaires.

Mais les vues et les tables ne sont pas les seuls objets que vous pouvez exécuter un SELECT déclaration sur. Le SELECT L'instruction peut également être utilisée sur d'autres objets tels que les fonctions d'ensemble de lignes, OPENXML et les fonctions définies par l'utilisateur.

Cet article fournit un exemple de sélection de données via une fonction table.

Exemple 1 - Fonction de base

Voici une fonction rapide qui sélectionne les données de base d'une table via une fonction table en ligne.

SELECT * FROM udf_Cats_ITVF();

Résultat :

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

La fonction ressemble à ceci :

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

Cette fonction sélectionne simplement toutes les lignes d'une table. Aucun argument n'est requis.

Si vous vouliez sélectionner un certain chat, vous auriez besoin d'ajouter un WHERE clause.

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

Résultat :

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

Maintenant, je dois admettre que cette fonction est un peu superflue, car nous aurions pu simplement sélectionner les données directement dans le tableau. Ou nous aurions pu créer une vue pour faire le travail. Mais les fonctions définies par l'utilisateur ont un avantage que les tables et les vues n'ont pas :les paramètres.

Exemple 2 - Fonction avec paramètres

L'un des avantages des fonctions table est qu'elles prennent en charge les paramètres. C'est là que la fonction devient un peu plus utile. Certains appellent les fonctions table des « vues paramétrées », car elles se comportent comme une vue, mais avec la fonctionnalité supplémentaire d'autoriser les paramètres.

Nous pourrions donc créer une variante de la fonction précédente pour accepter un argument pour le nom du chat.

SELECT * FROM udf_CatsByName_ITVF('Fetch');

Résultat :

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

La nouvelle fonction ressemble à ceci :

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

GO

Exemple 3 – Jointures

Les fonctions table peuvent être incluses dans les jointures.

Ici, je sélectionne toutes les colonnes d'une fonction table qui renvoie tous les albums d'un artiste donné :

SELECT * FROM ufn_AlbumsByArtist(1);

Résultat :

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

Le seul problème avec cette fonction est qu'elle ne renvoie pas le nom de l'artiste. Si je veux le nom de l'artiste, je dois le joindre à la table qui contient ces données. Dans ce cas, la table qui contient le nom de l'artiste s'appelle Artists , je peux donc modifier ma requête comme suit :

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

Résultat :

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