L'appel d'une fonction dans une instruction select - SQL
J'ai fait la déclaration suivante:
SELECT CASE WHEN (1 = 1) THEN 10 ELSE dbo.at_Test_Function(5) END AS Result
Je veux juste confirmer que dans ce cas, la fonction ne sera pas exécutée?
Ma raison de demander, c'est que la fonction est particulièrement lente et si le critiria est vrai que je veux éviter l'appel de la fonction...
Cheers
Anthony
Vous devez vous connecter pour publier un commentaire.
Ne font pas cette hypothèse, il est MAL. L'Optimiseur de Requête est totalement libre de choisir l'ordre d'évaluation il vous plaît et SQL comme langage n'offre PAS de opérateur de court-circuit. Même si vous pouvez trouver dans le test que la fonction n'est jamais évalué, en production, vous pouvez frapper chaque maintenant et puis les conditions qui causent le serveur pour choisir un autre plan d'exécution et d'abord évaluer la fonction, puis le reste de l'expression. Un exemple typique serait le cas où le serveur d'avis que le retour de la fonction est déterministe et non selon les données de ligne, auquel cas il faudrait d'abord évaluer la fonction permettant d'obtenir la valeur, et après que de commencer la numérisation de la table et d'évaluer les OÙ les critères d'inclusion à l'aide de la fonction de la valeur fixée à l'avance.
Votre assumpion est correct, il ne sera pas exécutée. Je comprends votre préoccupation, mais le CAS de construire est "smart" dans ce sens - il n'a pas d'évaluer toutes les conditions après la première condition valide. Voici un exemple pour le prouver. Si les deux branches de cette instruction ont été à l'exécution, vous obtenez une "division par zéro" erreur:
Cela fait-il sens?
En supposant que vous de faire une sorte de test... Si vous êtes en essayant d'éviter le at_Test_Function, pourquoi ne pas simplement en commentaire et ne
Mettre un
WaitFor Delay '00:00:05'
dans la fonction. Si l'instruction retourne immédiatement, il ne s'est pas exécuté si il faut 5 secondes pour revenir ensuite il a été exécuté.