Fonctions déterministes et non déterministesDeterministic and Nondeterministic Functions

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.Deterministic functions always return the same result any time they are called with a specific set of input values and given the same state of the database. 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é.Nondeterministic functions may return different results each time they are called with a specific set of input values even if the database state that they access remains the same. 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.For example, the function AVG always returns the same result given the qualifications stated above, but the GETDATE function, which returns the current datetime value, always returns a different result.

Plusieurs propriétés de fonctions définies par l’utilisateur déterminent la possibilité pour le Moteur de base de données SQL ServerSQL Server Database Engine 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.There are several properties of user-defined functions that determine the ability of the Moteur de base de données SQL ServerSQL Server Database Engine to index the results of the function, either through indexes on computed columns that call the function, or through indexed views that reference the function. Le déterminisme d'une fonction est l'une de ces propriétés.The determinism of a function is one such property. 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.For example, a clustered index cannot be created on a view if the view references any nondeterministic functions. Pour plus d’informations sur les propriétés des fonctions, dont le déterminisme, consultez Fonctions définies par l’utilisateur.For more information about the properties of functions, including determinism, see User-Defined Functions.

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.This topic identifies the determinism of built-in system functions and the effect on the deterministic property of user-defined functions when it contains a call to extended stored procedures.

Déterminisme des fonctions intégréesBuilt-in Function Determinism

Vous ne pouvez pas influer sur le déterminisme d'une fonction intégrée.You cannot influence the determinism of any built-in function. Chaque fonction intégrée est déterministe ou non déterministe en fonction de son implémentation par SQL ServerSQL Server.Each built-in function is deterministic or nondeterministic based on how the function is implemented by SQL ServerSQL Server. Par exemple, spécifier une clause ORDER BY dans une requête ne modifie pas le déterminisme d'une fonction utilisée dans cette requête.For example, specifying an ORDER BY clause in a query does not change the determinism of a function that used in that query.

Toutes les fonctions de chaîne intégrées sont déterministes.All of the string built-in functions are deterministic. Pour obtenir la liste de ces fonctions, consultez Fonctions de chaîne (Transact-SQL).For a list of these functions, see String Functions (Transact-SQL).

Les fonctions intégrées suivantes, qui ne sont pas des fonctions de chaîne, sont toujours déterministes :The following built-in functions from categories of built-in functions other than string functions are always deterministic.

ABSABS DATEDIFFDATEDIFF POWERPOWER
ACOSACOS DAYDAY RADIANSRADIANS
ASINASIN DEGREESDEGREES ROUNDROUND
ATANATAN EXPEXP SIGNSIGN
ATN2ATN2 FLOORFLOOR SINSIN
CEILINGCEILING ISNULLISNULL SQUARESQUARE
COALESCECOALESCE ISNUMERICISNUMERIC SQRTSQRT
COSCOS LOGLOG TANTAN
COTCOT LOG10LOG10 YEARYEAR
DATALENGTHDATALENGTH MONTHMONTH
DATEADDDATEADD NULLIFNULLIF

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 :The following functions are not always deterministic, but can be used in indexed views or indexes on computed columns when they are specified in a deterministic manner.

FonctionFunction CommentairesComments
Toutes les fonctions d'agrégationall aggregate functions Toutes les fonctions d'agrégation sont déterministes, sauf si elles sont spécifiées avec les clauses OVER et ORDER BY.All aggregate functions are deterministic unless they are specified with the OVER and ORDER BY clauses. Pour obtenir la liste de ces fonctions, consultez Fonctions d’agrégation (Transact-SQL).For a list of these functions, see Aggregate Functions (Transact-SQL).
CASTCAST Déterministe sauf si utilisée avec datetime, smalldatetimeou sql_variant.Deterministic unless used with datetime, smalldatetime, or sql_variant.
CONVERTCONVERT Déterministe sauf dans l'un des cas suivants :Deterministic unless one of these conditions exists:



Le type de source est sql_variant.Source type is sql_variant.

Le type de cible est sql_variant et son type de source est non déterministe.Target type is sql_variant and its source type is nondeterministic.

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é.Source or target type is datetime or smalldatetime, the other source or target type is a character string, and a nondeterministic style is specified. Pour être déterministe, le paramètre de style doit être une constante.To be deterministic, the style parameter must be a constant. De plus, les styles inférieurs ou égaux à 100 sont non-déterministes, à l'exception des styles 20 et 21.Additionally, styles less than or equal to 100 are nondeterministic, except for styles 20 and 21. Les styles supérieurs à 100 sont déterministes, à l'exception des styles 106, 107, 109 et 113.Styles greater than 100 are deterministic, except for styles 106, 107, 109 and 113.
CHECKSUMCHECKSUM Déterministe, sauf CHECKSUM().Deterministic, with the exception of CHECKSUM().
ISDATEISDATE 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.Deterministic only if used with the CONVERT function, the CONVERT style parameter is specified and style is not equal to 0, 100, 9, or 109.
RANDRAND RAND est déterministe uniquement quand un paramètre seed est spécifié.RAND is deterministic only when a seed parameter is specified.

Toutes les fonctions relatives à la configuration, aux curseurs, aux métadonnées, à la sécurité et aux statistiques système sont non déterministes.All the configuration, cursor, metadata, security, and system statistical functions are nondeterministic. 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 du système (Transact-SQL).For a list of these functions, see Configuration Functions (Transact-SQL), Cursor Functions (Transact-SQL), Metadata Functions (Transact-SQL), Security Functions (Transact-SQL), and System Statistical Functions (Transact-SQL).

Les fonctions intégrées suivantes, qui appartiennent à d'autres catégories, sont toujours non déterministes.The following built-in functions from other categories are always nondeterministic.

@@CONNECTIONS</span><span class="sxs-lookup">@@CONNECTIONS</span></span> GETDATEGETDATE
@@CPU_BUSY</span><span class="sxs-lookup">@@CPU_BUSY</span></span> GETUTCDATEGETUTCDATE
@@DBTS</span><span class="sxs-lookup">@@DBTS</span></span> GET_TRANSMISSION_STATUSGET_TRANSMISSION_STATUS
@@IDLE</span><span class="sxs-lookup">@@IDLE</span></span> LAGLAG
@@IO_BUSY</span><span class="sxs-lookup">@@IO_BUSY</span></span> LAST_VALUELAST_VALUE
@@MAX_CONNECTIONS</span><span class="sxs-lookup">@@MAX_CONNECTIONS</span></span> LEADLEAD
@@PACK_RECEIVED</span><span class="sxs-lookup">@@PACK_RECEIVED</span></span> MIN_ACTIVE_ROWVERSIONMIN_ACTIVE_ROWVERSION
@@PACK_SENT</span><span class="sxs-lookup">@@PACK_SENT</span></span> NEWIDNEWID
@@PACKET_ERRORS</span><span class="sxs-lookup">@@PACKET_ERRORS</span></span> NEWSEQUENTIALIDNEWSEQUENTIALID
@@TIMETICKS</span><span class="sxs-lookup">@@TIMETICKS</span></span> NEXT VALUE FORNEXT VALUE FOR
@@TOTAL_ERRORS</span><span class="sxs-lookup">@@TOTAL_ERRORS</span></span> NTILENTILE
@@TOTAL_READ</span><span class="sxs-lookup">@@TOTAL_READ</span></span> PARSENAMEPARSENAME
@@TOTAL_WRITE</span><span class="sxs-lookup">@@TOTAL_WRITE</span></span> PERCENTILE_CONTPERCENTILE_CONT
AT TIME ZONEAT TIME ZONE PERCENTILE_DISCPERCENTILE_DISC
CUME_DISTCUME_DIST PERCENT_RANKPERCENT_RANK
CURRENT_TIMESTAMPCURRENT_TIMESTAMP RANDRAND
DENSE_RANKDENSE_RANK RANKRANK
FIRST_VALUEFIRST_VALUE ROW_NUMBERROW_NUMBER
TEXTPTRTEXTPTR

Appel de procédures stockées étendues à partir de fonctionsCalling Extended Stored Procedures from Functions

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.Functions that call extended stored procedures are nondeterministic, because the extended stored procedures can cause side effects on the database. 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).Side effects are changes to a global state of the database, such as an update to a table, or to an external resource, such as a file or the network; for example, modifying a file or sending an e-mail message. Vous ne pouvez pas être assuré d'obtenir 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.You should not rely on returning a consistent result set when executing an extended stored procedure from a user-defined function. Les fonctions définies par l'utilisateur qui créent des effets secondaires sur la base de données ne sont pas recommandées.User-defined functions that create side effects on the database are not recommended.

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.When called from inside a function, the extended stored procedure cannot return result sets to the client. Toute API Open Data Services qui retourne des jeux de résultats au client aura un code de retour FAIL.Any Open Data Services API that returns result sets to the client will have a return code of FAIL.

La procédure stockée étendue ne peut pas se reconnecter à SQL ServerSQL Server.The extended stored procedure can connect back to SQL ServerSQL 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.However, the procedure cannot join the same transaction as the original function that invoked the extended stored procedure.

Comme pour les appels à partir d'une procédure stockée ou de traitement par lot, la procédure stockée étendue est exécutée dans le contexte du compte de sécurité MicrosoftMicrosoft Windows sous lequel fonctionne SQL ServerSQL Server .Similar to invocations from a batch or stored procedure, the extended stored procedure is executed in the context of the MicrosoftMicrosoft Windows security account under which SQL ServerSQL Server is running. 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.The owner of the extended stored procedure should consider this when granting permissions to other users to execute the procedure.