Un premier regard sur les plans d'exécution montre que l'expression 1/0
est définie dans les opérateurs Compute Scalar:

Maintenant, même si les plans d'exécution commencent à s'exécuter à l'extrême gauche, appelant de manière itérative Open
et des GetRow
méthodes sur les itérateurs enfants pour renvoyer des résultats, SQL Server 2005 et versions ultérieures contiennent une optimisation selon laquelle les expressions ne sont souvent définies que par un calcul scalaire, avec une évaluation différée jusqu'à une date ultérieure l'opération nécessite le résultat :

Dans ce cas, l'expression résultat de n'est nécessaire que lors de l'assemblage de la ligne pour le retour au client (que vous pouvez penser se produire au vertSELECT
icône ). Selon cette logique, une évaluation différée signifierait que l'expression n'est jamais évaluée car aucun des deux plans ne génère de ligne de retour. Pour travailler un peu le point, ni la recherche d'index clusterisé ni l'analyse de table ne renvoient une ligne, il n'y a donc pas de ligne à assembler pour le retour au client.
Cependant, il existe une optimisation distincte par laquelle certaines expressions peuvent être identifiées en tant que constantes d'exécution et ainsi évaluées une fois avant le début de l'exécution de la requête . Dans ce cas, une indication que cela s'est produit peut être trouvée dans le showplan XML (Clustered Index Seek plan à gauche, Plan Scan Table à droite):

J'ai écrit plus sur les mécanismes sous-jacents et comment ils peuvent affecter les performances dans ce billet de blog . En utilisant les informations fournies ici, nous pouvons modifier la première requête afin que les deux expressions soient évaluées et mises en cache avant le début de l'exécution:
select 1/0 * CONVERT(integer, @@DBTS)
from #temp
where id = 1
select 1/0
from #temp2
where id = 1
À présent, le premier plan contient également une référence d'expression constante et les deux requêtes produisent le message d'erreur. Le XML de la première requête contient:

Pour plus d'informations: Calculer les scalaires, les expressions et les performances