Qu'est-ce que cela signifie par "Des fonctions définies par l'user non déterministes peuvent être utilisées de manière déterministe"?

Selon la page MSDN SQL BOL (documentation en ligne) sur les fonctions déterministes et non déterministes, les fonctions non déterministes peuvent être utilisées " de manière déterministe "

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.

Qu'est-ce que cela signifie par des fonctions non-déterministes peut être utilisé de manière déterministe ?
Quelqu'un peut-il illustrer comment cela peut être fait? et vous le feriez?

le BOL énonce en fait:

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.

et ensuite, il indique quelles conditions doivent être remplies pour les rendre déterministes.

Par exemple

CAST – Déterministe à less d'être utilisé avec datetime, smalldatetime ou sql_variant

En d'autres termes, vous devez remplir ces conditions pour les utiliser de manière déterministe

Par exemple lorsque vous créez une table

CREATE TABLE [dbo].[deterministicTest]( [intDate] [int] NULL, [dateDateTime] [datetime] NULL, [castIntToDateTime] AS (CONVERT([datetime],[intDate],0)), [castDateTimeToInt] AS (CONVERT([int],[dateDateTime],0)), [castIntToVarchar] AS (CONVERT([varchar],[intDate],0)) ) ON [PRIMARY] 

vous pouvez appliquer un index sur castIntToVarchar mais si vous essayez d'append un index à castDateTimeToInt ou castIntToDateTime vous obtiendrez l'erreur suivante:

La colonne 'castDateTimeToInt' (castIntToDateTime) de la table 'dbo.deterministicTest' ne peut pas être utilisée dans un index ou des statistics ou comme une key de partition car elle est non déterministe.

Donc le dateTime ne peut pas être utilisé comme source ni le format cible de la fonction CONVERT si vous voulez restr déterministe

Le fait qu'une fonction soit déterministe signifie qu'il est toujours garanti de renvoyer la même valeur de sortie pour les mêmes arguments d'input.

En utilisant une fonction déterministe d'une manière déterministe, je suppose que cela signifie que vous vous assurez que la gamme d'arguments que vous passerez à la fonction est telle que la valeur de return sera déterministe, c'est-à-dire. dépend seulement opon ces arguments.

Ce que cela implique dans la pratique dépend de ce que fait la fonction et de quelle manière elle est non-déterministe.

Un exemple:

 RAND(1) // deterministic, always returns the same number 

contre:

 RAND() // non-deterministic, returns new random number on each call 

Notez que cela utilise la définition de l'article MSDN du mot "déterministe"

Les définitions de BOL doivent être:

"Les fonctions déterministes renvoient toujours le même résultat sur la même ligne chaque fois qu'elles sont appelées avec un set spécifique de valeurs d'input (ligne) et reçoivent le même état de la database.

En d'autres termes, les fonctions déterministes renvoient toujours le même résultat sur n'importe quelle valeur fixe particulière de leur domaine (dans ce cas, le domaine est une ligne).

Les fonctions non déterministes peuvent renvoyer des résultats différents chaque fois qu'elles sont appelées avec un set spécifique de valeurs d'input (ligne) même si l'état de la database à laquelle elles accèdent rest le même.

Dans ce cas, des fonctions non déterministes

a) Renvoyer des valeurs différentes à chaque appel.

b) dépend des valeurs en dehors de la ligne sur laquelle elles ont été appliquées.

Exemples de groupe a): NEWID (), GETDATE (), GETUTDATE (), RAND () sans graine spécifiée.

Exemples du groupe b): GET_TRANSMISSION_STATUS (), LAG (), RANK (), DENSE_RANK (), ROW_NUMBER (), NTILE (), SUM () lorsque spécifié avec les clauses OVER et ORDER BY. "

S'il vous plaît noter que certains auteurs utilisent une définition différente des fonctions déterministes qui peuvent conduire à la confusion.