Fonctions déterministes et non déterministes
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é.
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. Le déterminisme d'une fonction est l'une de ces propriétés. Par exemple, un index cluster ne peut pas être créé sur une vue si celle-ci fait référence à une fonction non déterministe. Pour plus d'informations sur les propriétés des fonctions, y compris le déterminisme, consultez Recommandations pour la conception des fonctions définies par l'utilisateur.
Cette rubrique identifie le déterminisme des fonctions système intégrées, ainsi que 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 des fonctions intégrées
Vous ne pouvez pas influer sur le déterminisme d'une fonction intégrée. Chaque fonction intégrée est déterministe ou non déterministe en fonction de son implémentation par SQL Server.
Toutes les fonctions intégrées d'agrégation ou de chaîne sont déterministes. Pour obtenir une liste de ces fonctions, consultez Fonctions d'agrégation (Transact-SQL) et Fonctions de chaîne (Transact-SQL).
Les fonctions intégrées suivantes, qui ne sont ni des fonctions d'agrégation ni des fonctions de chaîne, sont toujours déterministes :
ABS |
DATEDIFF |
POWER |
ACOS |
DAY |
RADIANS |
ASIN |
DEGREES |
ROUND |
ATAN |
EXP |
SIGN |
ATN2 |
FLOOR |
SIN |
CEILING |
ISNULL |
SQUARE |
COALESCE |
ISNUMERIC |
SQRT |
COS |
LOG |
TAN |
COT |
LOG10 |
YEAR |
DATALENGTH |
MONTH |
|
DATEADD |
NULLIF |
|
Les fonctions suivantes ne sont pas toujours déterministes mais peuvent être utilisées dans les vues indexées ou les index de colonnes calculées si elles sont spécifiées de manière déterministe :
Fonction |
Commentaires |
---|---|
CAST |
Déterministe sauf si elle est utilisée avec datetime, smalldatetime ou sql_variant. |
CONVERT |
Déterministe sauf dans l'un des cas suivants :
|
CHECKSUM |
Déterministe, sauf CHECKSUM(*). |
ISDATE |
Déterministe uniquement si utilisé avec la fonction CONVERT, si le paramètre de style CONVERT est spécifié et si le style est différent de 0, 100, 9 ou 109. |
RAND |
RAND est déterministe uniquement lorsque la valeur de seed est spécifiée. |
Toutes les fonctions relatives à la configuration, aux curseurs, aux métadonnées, à la sécurité et aux statistiques système sont non déterministes. Pour obtenir une 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, qui appartiennent à d'autres catégories, sont toujours non déterministes.
@@CONNECTIONS |
@@TOTAL_WRITE |
@@CPU_BUSY |
CURRENT_TIMESTAMP |
@@DBTS |
GETDATE |
@@IDLE |
GETUTCDATE |
@@IO_BUSY |
GET_TRANSMISSION_STATUS |
@@MAX_CONNECTIONS |
MIN_ACTIVE_ROWVERSION |
@@PACK_RECEIVED |
NEWID |
@@PACK_SENT |
NEWSEQUENTIALID |
@@PACKET_ERRORS |
PARSENAME |
@@TIMETICKS |
RAND |
@@TOTAL_ERRORS |
TEXTPTR |
@@TOTAL_READ |
Appel de procédures stockées étendues à partir de fonctions
Les fonctions qui appellent des procédures stockées étendues sont non déterministes car les procédures stockées étendues peuvent provoquer des effets secondaires sur la base de données. Ces effets secondaires sont des modifications de l'état global de la base de données, comme la mise à jour d'une table ou d'une ressource externe, telle qu'un fichier ou le réseau (par exemple la modification d'un fichier ou l'envoi d'un courrier électronique). Ne vous fiez pas au 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.
Une procédure stockée étendue appelée depuis l'intérieur d'une fonction ne peut pas retourner de jeux de résultats au client. Tout API Open Data Services qui retourne des jeux de résultats au client aura un code de retour FAIL.
La procédure stockée étendue ne peut pas se reconnecter à SQL Server. Cependant, la procédure ne peut pas joindre la même transaction que la fonction originale ayant appelé la procédure stockée étendue.
Comme pour les invocations à 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 fonctionne SQL Server. Le propriétaire de la procédure stockée étendue doit prendre ce fait en considération lorsqu'il accorde à d'autres utilisateurs la permission d'exécuter la procédure.
Voir aussi