Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Endpoint SQL analytics dans Microsoft Fabric
Entrepôt dans Microsoft Fabric
Base de données SQL dans Microsoft Fabric
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 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 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 précédemment, mais la GETDATE fonction, qui retourne la valeur datetime actuelle, retourne toujours un résultat différent.
Plusieurs propriétés de fonctions définies par l’utilisateur déterminent la possibilité pour le moteur de base de données de 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, notamment le déterminisme, consultez les fonctions définies par l’utilisateur.
Les fonctions déterministes doivent être liées au schéma. Utilisez la clause SCHEMABINDING lors de la création d’une fonction déterministe.
Cet article 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éterminer si une fonction est déterministe
Vous pouvez vérifier si une fonction est déterministe en interrogeant la propriété de l'objet is_deterministic pour la fonction. L’exemple suivant détermine si la fonction Sales.CalculateSalesTax est déterministe.
SELECT OBJECTPROPERTY(OBJECT_ID('Sales.CalculateSalesTax'), 'IsDeterministic');
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 la façon dont la fonction est implémentée par SQL Server. Par exemple, la spécification d’une ORDER BY clause dans une requête ne modifie pas le déterminisme d’une fonction utilisée dans cette requête.
Toutes les fonctions de chaîne intégrées sont déterministes, sauf FORMAT. Pour obtenir la liste de ces fonctions, consultez Fonctions de chaîne.
Les fonctions intégrées suivantes, qui ne sont pas des fonctions de chaîne, sont toujours déterministes :
ABSACOSASINATANATN2CEILINGCOALESCECOSCOTDATALENGTHDATEADDDATEDIFFDAYDEGREESEXPFLOORISNULLISNUMERICLOGLOG10MONTHNULLIFPOWERRADIANSROUNDSIGNSINSQRTSQUARETANYEAR
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 |
|---|---|
| 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 et OVER les ORDER BY clauses. Pour obtenir la liste de ces fonctions, consultez Fonctions d’agrégation. |
CAST |
Déterministe sauf si utilisée avec datetime, smalldatetimeou sql_variant. |
CONVERT |
Déterministe sauf dans l'un des cas suivants : Le type de source est sql_variant. Le type de cible est sql_variant et son type de source est non déterministe. Le type de source ou de cible est datetime ou smalldatetime, l’autre type de source ou de 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. De plus, 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. |
CHECKSUM |
Déterministe, à l’exception de CHECKSUM(*). |
ISDATE |
Déterministe uniquement si elle est utilisée avec la CONVERT fonction, le CONVERT paramètre de style 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 relatives à la configuration, aux curseurs, aux métadonnées, à la sécurité et aux statistiques système sont non déterministes. Vous pouvez consulter une liste de ces fonctions.
Les fonctions intégrées suivantes, qui appartiennent à d'autres catégories, sont toujours non déterministes.
@@CONNECTIONS@@CPU_BUSY@@DBTS@@IDLE@@IO_BUSY@@MAX_CONNECTIONS@@PACKET_ERRORS@@PACK_RECEIVED@@PACK_SENT@@TIMETICKS@@TOTAL_ERRORS@@TOTAL_READ@@TOTAL_WRITEAT TIME ZONECUME_DISTCURRENT_TIMESTAMPDENSE_RANKFIRST_VALUEFORMATGETDATEGETUTCDATEGET_TRANSMISSION_STATUSLAGLAST_VALUELEADMIN_ACTIVE_ROWVERSIONNEWIDNEWSEQUENTIALIDNEXT VALUE FORNTILEPARSENAMEPERCENTILE_CONTPERCENTILE_DISCPERCENT_RANKRANDRANKROW_NUMBERTEXTPTR
Appeler des 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. Les effets secondaires sont des modifications apportées à un état global de la base de données, comme une mise à jour d’une table ou à une ressource externe, telle qu’un fichier ou le réseau. Les exemples incluent la modification d’un fichier ou l’envoi d’un message électronique. N’attendez pas de 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 de jeux de résultats au client. Toute API Open Data Services qui retourne des jeux de résultats au client a 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 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é Windows sous lequel SQL Server s’exécute. Le propriétaire de la procédure stockée étendue doit prendre en compte les autorisations de ce contexte de sécurité quand il accorde à d’autres utilisateurs l’autorisation d’exécuter la procédure.