Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les fonctions déterministes retournent toujours le même résultat chaque fois qu’elles sont appelées avec un ensemble spécifique de valeurs d’entrée et étant donné le même état de la base de données. Les fonctions non déterministes peuvent retourner des résultats différents 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 auquel ils accèdent reste le même. Par exemple, la fonction AVG retourne toujours le même résultat en fonction des qualifications indiquées ci-dessus, mais la fonction GETDATE, qui retourne la valeur datetime actuelle, retourne toujours un résultat différent.
Il existe plusieurs propriétés des fonctions définies par l’utilisateur qui déterminent la capacité du moteur de base de données SQL Server à indexer les résultats de la fonction, soit par le biais d’index sur des colonnes calculées qui appellent la fonction, soit par le biais de vues indexées qui référencent la fonction. Le déterminisme d’une fonction est une telle propriété. Par exemple, un index cluster ne peut pas être créé sur une vue si la vue fait référence à des fonctions non déterministes. Pour plus d’informations sur les propriétés des fonctions, notamment le déterminisme, consultez User-Defined Functions.
Cette rubrique identifie le déterminisme des fonctions système intégrées et l’effet sur la propriété déterministe des fonctions définies par l’utilisateur lorsqu’elle contient un appel à des procédures stockées étendues.
Déterminisme de fonction intégré
Vous ne pouvez pas influencer le déterminisme d’une fonction intégrée. Chaque fonction intégrée est déterministe ou non déterministe en fonction de la façon dont la fonction est implémentée par SQL Server. Par exemple, la spécification d’une clause ORDER BY dans une requête ne modifie pas le déterminisme d’une fonction utilisée dans cette requête.
Toutes les fonctions intégrées de chaîne sont déterministes. Pour obtenir la liste de ces fonctions, consultez Fonctions de chaîne (Transact-SQL).
Les fonctions intégrées suivantes provenant de catégories de fonctions intégrées autres que les fonctions de chaîne sont toujours déterministes.
| ABS (Système de freinage antiblocage) | DATEDIFF | POUVOIR |
| ACOS | JOUR | RADIANS |
| ASIN | DEGRÉS | ROND |
| ATAN | EXP | SIGNE |
| ATN2 | SOL | PÉCHÉ |
| PLAFOND | ESTNUL | CARRÉ |
| COALESCE | ISNUMERIC | SQRT |
| COS | RAPPORT | TANNER |
| LIT | LOG10 | ANNÉE |
| LONGUEUR DE DONNÉES | MOIS | |
| DATEADD | NULLIF |
Les fonctions suivantes ne sont pas toujours déterministes, mais peuvent être utilisées dans des vues indexées ou des index sur des colonnes calculées lorsqu’elles sont spécifiées de manière déterministe.
| Fonction | Commentaires |
|---|---|
| toutes les fonctions d’agrégation | Toutes les fonctions d’agrégation sont déterministes, sauf si elles sont spécifiées avec les clauses OVER et ORDER BY. Pour obtenir la liste de ces fonctions, consultez Fonctions d’agrégation (Transact-SQL). |
| JETER | Déterministe, sauf si elle est utilisée avec datetime, smalldatetimeou sql_variant. |
| CONVERTIR | Déterministe, sauf si l’une de ces conditions existe : Le type de source est sql_variant.Le type cible est sql_variant et son type source est non déterministe.Le type source ou cible est datetime ou smalldatetime, l’autre type source ou cible est une chaîne de caractères et un style non déterministe est spécifié. Pour être déterministe, le paramètre de style doit être une constante. En outre, les styles inférieurs ou égaux à 100 sont non déterministes, à l’exception des styles 20 et 21. Les styles supérieurs à 100 sont déterministes, à l’exception des styles 106, 107, 109 et 113. |
| SOMME DE CONTRÔLE | Déterministe, à l’exception de CHECKSUM(*). |
| ISDATE | Déterministe uniquement si elle est utilisée avec la fonction CONVERT, le paramètre de style CONVERT est spécifié et le style n’est pas égal à 0, 100, 9 ou 109. |
| RAND | RAND est déterministe uniquement lorsqu’un paramètre de départ est spécifié. |
Toutes les fonctions statistiques de configuration, de curseur, de métadonnées, de sécurité et de système ne sont pas déterministes. Pour obtenir la liste de ces fonctions, consultez Fonctions de configuration (Transact-SQL),Fonctions de curseur (Transact-SQL),Fonctions de métadonnées (Transact-SQL) , Fonctions de sécurité (Transact-SQL) et Fonctions statistiques système (Transact-SQL) .
Les fonctions intégrées suivantes d’autres catégories sont toujours non déterministes.
| @@CONNEXIONS | GETDATE |
| @@CPU_BUSY | GETUTCDATE |
| @@DBTS | OBTENIR_STATUT_TRANSMISSION |
| @@IDLE | RETARD |
| @@IO_BUSY | DERNIÈRE_VALEUR |
| @@MAX_CONNECTIONS | PLOMB |
| @@COLIS_REÇU | MIN_ACTIVE_ROWVERSION |
| @@PACK_SENT | NEWID |
| @@PACKET_ERRORS | NEWSEQUENTIALID |
| @@TIMETICKS | VALEUR SUIVANTE POUR |
| @@TOTAL_ERRORS | NTILE |
| @@TOTAL_READ | PARSENAME |
| @@TOTAL_WRITE | PERCENTILE_CONT |
| CUME_DIST | PERCENTILE_DISC |
| CURRENT_TIMESTAMP | RANG_POURCENTAGE |
| DENSE_RANK | RAND |
| PREMIÈRE_VALEUR | RANG |
| ROW_NUMBER | |
| TEXTPTR |
Appel de procédures stockées étendues à partir de fonctions
Les fonctions qui appellent des procédures stockées étendues ne sont pas déterministes, car les procédures stockées étendues peuvent entraîner des effets secondaires sur la base de données. Les effets secondaires sont des modifications apportées à un état global de la base de données, comme une mise à jour vers une table, ou à une ressource externe, telle qu’un fichier ou le réseau ; par exemple, la modification d’un fichier ou l’envoi d’un message électronique. Vous ne devez pas vous appuyer sur le retour d’un jeu de résultats cohérent lors de l’exécution d’une procédure stockée étendue à partir d’une fonction définie par l’utilisateur. Les fonctions définies par l’utilisateur qui créent des effets secondaires sur la base de données ne sont pas recommandées.
Lorsqu’elle est appelée à partir d’une fonction, la procédure stockée étendue ne peut pas retourner les jeux de résultats au client. Toute API Open Data Services qui retourne des jeux de résultats au client aura un code de retour d’FAIL.
La procédure stockée étendue peut se reconnecter à SQL Server. Toutefois, la procédure ne peut pas faire partie de la même transaction que la fonction originale qui a appelé la procédure stockée étendue.
Comme pour les appels à partir d’un lot ou d’une procédure stockée, la procédure stockée étendue est exécutée dans le contexte du compte de sécurité Microsoft Windows sous lequel SQL Server s’exécute. Le propriétaire de la procédure stockée étendue doit tenir compte de cela lors de l’octroi d’autorisations à d’autres utilisateurs pour exécuter la procédure.