En fait, la limitation viens d'une aute limitation du moteur.
Pendant une requête, MS SQL Server 2000 est incapable de bloquer l'heure interne... Et encore moins si cette heure provient d'outils annexes.
Pour cette raison, les FONCTION doivent impérativement être "je sais plus le terme", c'est à dire produire un résultat que le temps ne peut influencer.
Par exemple, il est impossible d'appeler GUID() ou RAND() dans une fonction, car chaque appel, avec les mêmes paramètres, dans le même environnement et la même transaction retournera des valeurs différentes.
Dans une requête du type :
Code :
- select champA, myFunction(champB) from maTable
|
Représente bien le problème.
Si durant le seclect, le comportement de "myFunction()" évolue, on va avoir un comportement étrange et une requête qui dont le résultat n'a pas de sens. Par exemple, si la fonction fait un test sur la date, et si entre 9am et 6pm elle retourne 1 et 0 sinon, alors si on lance la requête à 5:59pm et qu'elle dure deux secondes, on est comme des cons. Le moteur ne sâchant limiter que "Date()" on n'a pas de souci dans ce cas... Mais pour tous les autres (notamment un EXECUTE, qui tourne dans un espace séparé, donc une valeur de "Date()" différente), ça marche pas.
Une procédure n'a pas cette limitation (car normalement, on ne l'appelle pas au sein d'une requête, donc si le résultat évolue d'une ligne à l'autre, ce n'est pas grave).
Donc... Afin d'empêcher les fonctions d'avoir un comportement dépendant du temps, ils ont bloqué l'appel aux procédures depuis les fonctions.
C'est un peu con en effet mais bon, c'est la vie
Message édité par Arjuna le 07-10-2005 à 20:51:01