Fonctions déterministes et non déterministes

S’applique à : SQL Server (toutes les versions prises en charge) Azure SQL base de données Azure SQL Managed Instance

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 donnent 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’ils sont appelés 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 pour les conditions 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 de fonctions définies par l’utilisateur qui déterminent la capacité du moteur de base de données SQL Server d’indexer les résultats de la fonction, soit via des index sur des colonnes calculées qui appellent la fonction, soit via des vues indexées qui référencent la fonction. Le déterminisme d'une fonction est l'une de ces propriétés. Par exemple, un index cluster ne peut pas être créé dans une vue si l’affichage fait référence à des fonctions non déterministes. Pour plus d’informations sur les propriétés des fonctions, dont le déterminisme, consultez Fonctions définies par l’utilisateur.

Les fonctions déterministes doivent être liées au schéma. Utilisez la clause lors de la SCHEMABINDING création d’une fonction déterministe.

Cet article 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’il contient un appel aux 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 is_deterministic propriété objet pour la fonction. L’exemple ci-dessous détermine si la fonction Sales.CalculateSalesTax est déterministe.

SELECT OBJECTPROPERTY(OBJECT_ID('Sales.CalculateSalesTax'), 'IsDeterministic');

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 de chaîne intégrées sont déterministes, sauf FORMAT. Pour obtenir la liste de ces fonctions, consultez String Functions (Transact-SQL).

Les fonctions intégrées suivantes, qui ne sont pas des fonctions de chaîne, sont toujours déterministes :

  • ABS
  • ACOS
  • ASIN
  • ATAN
  • ATN2
  • CEILING
  • COALESCE
  • COS
  • COT
  • DATALENGTH
  • DATEADD
  • DATEDIFF
  • DAY
  • DEGREES
  • EXP
  • FLOOR
  • ISNULL
  • ISNUMERIC
  • LOG
  • LOG10
  • MONTH
  • NULLIF
  • POWER
  • RADIANS
  • ROUND
  • SIGN
  • SIN
  • SQRT
  • SQUARE
  • TAN
  • YEAR

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).
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 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 quand un paramètre seed 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 voir 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_WRITE
  • AT TIME ZONE
  • CUME_DIST
  • CURRENT_TIMESTAMP
  • DENSE_RANK
  • FIRST_VALUE
  • FORMAT
  • GETDATE
  • GETUTCDATE
  • GET_TRANSMISSION_STATUS
  • LAG
  • LAST_VALUE
  • LEAD
  • MIN_ACTIVE_ROWVERSION
  • NEWID
  • NEWSEQUENTIALID
  • NEXT VALUE FOR
  • NTILE
  • PARSENAME
  • PERCENTILE_CONT
  • PERCENTILE_DISC
  • PERCENT_RANK
  • RAND
  • RANK
  • ROW_NUMBER
  • TEXTPTR

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. 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 appuyez pas 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 a un code de retour FAIL.

La procédure stockée étendue peut se connecter à SQL Server. Toutefois, la procédure ne peut pas joindre la même transaction que la fonction d’origine 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 est en cours d’exécution. 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.

Voir aussi