Recommandations pour la conception des fonctions définies par l'utilisateur

Une fonction définie par l'utilisateur est stockée en tant qu'objet de base de données qui fournit du code réutilisable, exploitable :

  • dans des instructions Transact-SQL telles que SELECT ;

  • dans des applications appelant la fonction ;

  • dans la définition d'une autre fonction définie par l'utilisateur ;

  • pour paramétrer une vue ou améliorer la fonctionnalité d'une vue indexée ;

  • pour définir une colonne dans une table ;

  • pour définir une contrainte CHECK sur une colonne ;

  • pour remplacer une procédure stockée.

Choix du type de fonction

Lorsque vous concevez une fonction définie par l'utilisateur, déterminez d'abord le type de fonction le mieux adapté à vos besoins. Définissez le rôle que doit jouer la fonction :

  • retourner une valeur scalaire (valeur unique) ;

  • retourner une table (plusieurs lignes) ;

  • effectuer un calcul complexe ;

  • avoir accès à des données SQL Server.

Les fonctions définies par l'utilisateur écrites en Transact-SQL ou .NET Framework peuvent retourner des valeurs scalaires et des valeurs tabulaires.

Propriétés des fonctions

Plusieurs propriétés de fonctions définies par l'utilisateur déterminent la possibilité pour le Moteur de base de données SQL Server d'indexer les résultats d'une fonction, par le biais d'index sur des colonnes calculées qui appellent la fonction ou de vues indexées qui y font référence. Ces propriétés sont également applicables aux méthodes des types CLR définis par l'utilisateur.

Propriété de déterminisme

Les fonctions déterministes retournent toujours le même résultat quel que soit le moment auquel elles sont appelées avec un ensemble spécifique de valeurs d'entrée et sur la base du même état de la base de données. Les fonctions non déterministes peuvent retourner différents résultats chaque fois qu'elles sont appelées avec un ensemble spécifique de valeurs d'entrée, même si l'état de la base de données à laquelle elles accèdent demeure inchangé.

Le Moteur de base de données analyse automatiquement le corps d'une fonction Transact-SQL et détermine si elle est déterministe. Par exemple, si la fonction appelle des procédures stockées étendues ou d'autres fonctions qui sont non déterministes, le Moteur de base de données la marque comme étant non déterministe. Dans le cas d'une fonction CLR (Common Language Runtime), le Moteur de base de données laisse à son auteur le soin de la marquer comme étant déterministe ou non déterministe à l'aide de l'attribut personnalisé SqlFunction.

Précision

Une fonction définie par l'utilisateur est considérée comme précise si elle n'implique pas d'opérations à virgule flottante.

Le Moteur de base de données analyse automatiquement le corps d'une fonction Transact-SQL et détermine si elle est précise. Dans le cas d'une fonction CLR, le Moteur de base de données laisse à son auteur le soin de la marquer comme étant précise ou non précise à l'aide de l'attribut personnalisé SqlFunction.

Propriété d'accès aux données

Cette propriété indique si la fonction accède au serveur de base de données local à l'aide du fournisseur managé intra-processus SQL Server. Pour plus d'informations, consultez Accès aux données à partir d'objets de base de données CLR.

Le Moteur de base de données analyse automatiquement le corps d'une fonction Transact-SQL et détermine si elle a un rôle d'accès aux données. Dans le cas d'une fonction CLR, le Moteur de base de données laisse à son auteur le soin d'indiquer les caractéristiques d'accès aux données à l'aide de l'attribut personnalisé SqlFunction. Le Moteur de base de données applique cette propriété au moment de l'exécution. Si la fonction a un rôle d'accès aux données alors qu'elle indique que la propriété DataAccess a pour valeur None, elle échoue au moment de l'exécution.

Propriété d'accès aux données système

Cette propriété indique si la fonction accède aux métadonnées système du serveur de base de données local à l'aide du fournisseur managé intra-processus SQL Server.

Le Moteur de base de données analyse automatiquement le corps d'une fonction Transact-SQL et détermine si elle a un rôle d'accès aux données système. Dans le cas d'une fonction CLR, le Moteur de base de données laisse à son auteur le soin d'indiquer les caractéristiques d'accès aux données système à l'aide de l'attribut personnalisé SqlFunction. Le Moteur de base de données applique cette propriété au moment de l'exécution. Si la fonction a un rôle d'accès aux données système alors qu'elle indique que la propriété SystemDataAccess a pour valeur None, elle échoue au moment de l'exécution.

IsSystemVerified

Cette propriété indique si les propriétés de déterminisme et de précision de la fonction sont vérifiables par le Moteur de base de données. Cette propriété a pour valeur true dans le cas des fonctions Transact-SQL, sous réserve qu'elles n'appellent pas de fonctions dont la propriété IsSystemVerified a pour valeur false. Cette propriété a pour valeur false dans le cas des fonctions CLR.

Le Moteur de base de données dérive automatiquement la propriété IsSystemVerified des fonctions. Dans le cas des fonctions Transact-SQL, si elles accèdent à une fonction dont la propriété IsSystemVerified a pour valeur false, la propriété IsSystemVerified de la fonction elle-même a pour valeur false.

Pour plus d'informations sur les fonctions dans les colonnes calculées indexées et dans les vues indexées, consultez Création d'index sur des colonnes calculées et Création de vues indexées.