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

Qu'est-ce qu'une fonction table dans SQL Server ?

Dans SQL Server, une fonction table (TVF) est une fonction définie par l'utilisateur qui renvoie une table. Cela contraste avec une fonction scalaire, qui renvoie une valeur unique.

Vous pouvez appeler une fonction table de la même manière que vous pouvez interroger une table. Par exemple, vous pouvez l'utiliser dans un SELECT déclaration. Dans certains cas, les fonctions table peuvent également être utilisées pour mettre à jour, supprimer et insérer des données.

Types de fonctions de table

Lorsque vous créez une fonction table, vous avez le choix de créer une fonction table Transact-SQL ou une fonction table CLR (Common Language Runtime).

Fonctions table Transact-SQL

Les TVF Transact-SQL peuvent être l'une des suivantes :

Fonction de table en ligne (ITVF)
Lorsque vous créez un ITVF, vous commencez la définition de la fonction avec RETURNS TABLE , et le SELECT suivant définit la structure de la table de retour.
Fonction table multi-instructions (MSTVF)
Une fonction table multi-instructions peut contenir plusieurs instructions, dont les résultats sont enregistrés dans une variable que vous déclarez au début de la fonction. Lorsque vous faites cela, vous spécifiez explicitement la structure de la table de retour.

Fonctions de table CLR

Du point de vue du CLR, la syntaxe est similaire à celle de T-SQL ITVF, mais légèrement différente. Vous spécifiez explicitement la structure de la table de retour, mais vous ne déclarez pas de variable de retour.

Les fonctions table CLR sont implémentées en tant que méthodes sur une classe dans un assembly Microsoft .NET Framework.

Pour une présentation plus détaillée des TVF CLR, consultez la documentation de Microsoft sur les fonctions de table CLR.

Exemple 1 – Fonction de table en ligne

Voici un exemple du code T-SQL utilisé pour créer une fonction table en ligne.

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

Nous pouvons dire qu'il s'agit d'une fonction table en ligne, car elle ne spécifie pas la structure de la table de retour. Il indique simplement RETURNS TABLE , puis s'appuie sur le SELECT pour déterminer la structure de la table de retour.

Dans ce cas, la fonction nécessite que le nom du chat soit passé en argument.

Voir Créer une fonction table en ligne pour des exemples d'ajout d'options telles que la liaison de schéma et le chiffrement.

La liaison de schéma est généralement une bonne idée, car elle empêchera toute modification défavorable des objets sous-jacents auxquels la fonction fait référence.

Exemple 2 - Fonction table multi-instructions

Voici comment nous écririons la fonction si nous voulions qu'elle soit une fonction table à plusieurs instructions.

CREATE FUNCTION udf_CatsByName_MSTVF( @CatName varchar(70) )
    RETURNS @cats TABLE (
        CatId int,
        CatName varchar(70),
        Phone varchar(10)
    )
AS
BEGIN
    INSERT INTO @cats
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName;

    RETURN;
END;
GO

Dans ce cas, nous utilisons une variable de type table appelé @cats et nous spécifions explicitement la structure de la table de retour. Les résultats de la requête sont stockés dans cette variable, qui est ensuite renvoyée lorsque la fonction est invoquée.

Cet exemple ne rend pas justice à MSTVF, car je n'inclus qu'une seule déclaration. Le point principal des MSTVF est que vous pouvez inclure plusieurs instructions, et vous pouvez ajouter la sortie de ces instructions à la variable de retour.

Voir Créer une fonction table multi-instructions pour un exemple d'utilisation de plusieurs instructions, ainsi que des exemples d'ajout d'options telles que la liaison de schéma et le chiffrement.

Exemple 3 – Sélectionner des données dans nos fonctions de table

Alors maintenant que nous avons créé nos fonctions, nous pouvons les invoquer toutes les deux en utilisant un SELECT déclaration.

SELECT * FROM udf_CatsByName_ITVF('Tom');
SELECT * FROM udf_CatsByName_MSTVF('Tom');

Résultat :

+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 3       | Tom       | 7871237652 |
+---------+-----------+------------+
(1 row affected)
+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 3       | Tom       | 7871237652 |
+---------+-----------+------------+
(1 row affected)

L'ITVF et le MSTVF ont été appelés à l'aide de la même syntaxe et les deux ont renvoyé le même résultat.

Invoquer des fonctions de table

Les fonctions de table peuvent être appelées là où les expressions de table sont autorisées dans le FROM clause de SELECT , INSERT , UPDATE , ou DELETE déclarations.

Cela signifie que vous pouvez sélectionner des données, insérer des données, mettre à jour des données et même supprimer des données via une fonction table.

Voici des articles qui illustrent chacun :

  • Sélectionner des données via une fonction table
  • Mettre à jour les données via une fonction table
  • Insérer des données via une fonction table
  • Supprimer des données via une fonction table