Cette fonctionnalité "paresseuse" dont vous parlez est en fait appelée "court-circuit"
Et cela ne fonctionne PAS toujours surtout si vous avez un udf dans l'expression ISNULL.
Vérifiez cet article où les tests ont été effectués pour le prouver:
Short-circuiting (mainly in VB.Net and SQL Server)
T-SQL est un langage déclaratif par conséquent, il ne peut pas contrôler l'algorithme utilisé pour obtenir les résultats .. il déclare que les résultats qu'il a besoin. C'est au moteur de recherche/optimiseur de trouver le plan rentable. Et dans SQL Server, l'optimiseur utilise la "détection de contradiction" qui ne garantit jamais une évaluation de gauche à droite comme vous le feriez dans les langages procéduraux.
Pour votre exemple, a fait un test rapide:
créé l'UDF scalaire à valeur d'invoquer la division par zéro:
CREATE FUNCTION getMyFunction
(@MyValue INT)
RETURNS INT
AS
BEGIN
RETURN (1/0)
END
GO
L'exécution de la requête ci-dessous ne me donne pas une erreur Divide by zero error encountered
.
DECLARE @test INT
SET @test = 1
SET @test = ISNULL(@test, (dbo.getMyFunction(1)))
SELECT @test
Modification du SET
à la déclaration ci-après ne me donner l'erreur Divide by zero error encountered.
. (Introduit un SELECT
dans ISNULL
)
SET @test = ISNULL(@test, (SELECT dbo.getMyFunction(1)))
mais avec des valeurs au lieu des variables, il ne m'a jamais donné l'erreur.
SELECT ISNULL(1, (dbo.getMyFunction(1)))
SELECT ISNULL(1, (SELECT dbo.getMyFunction(1)))
Donc, à moins que vous vraiment comprendre comment l'optimiseur évalue ces expressions pour toutes les permutations, il serait prudent de ne pas compter sur les capacités de court-circuit de T-SQL.
Vous pouvez ajouter une instruction 'PRINT' à votre fonction et vous en rendre compte par vous-même. –
@JarrettMeyer J'ai utilisé cette technique pour apprendre la programmation dans mon enfance, mais elle ne s'applique pas de nos jours parce que vous ne savez pas ce qu'est le détail de l'implémentation et ce qu'est le comportement documenté. Apprentissage devient difficile :(juste dire ... –
@JarrettMeyer, «PRINT» n'est pas acceptable dans un fichier UDF – Kash