Esta característica "perezosa" a la que se refiere de hecho se llama "cortocircuito"
Y NO siempre funciona especialmente si tiene un udf en la expresión ISNULL.
Comprobar este artículo, donde se llevaron a cabo pruebas para demostrarlo:
Short-circuiting (mainly in VB.Net and SQL Server)
T-SQL es un lenguaje declarativo, por tanto, no puede controlar el algoritmo utilizado para obtener los resultados .. simplemente declara lo que da como resultado que necesita. Es hasta el motor/optimizador de consultas para descubrir el plan rentable. Y en SQL Server, el optimizador usa la "detección de contradicciones", que nunca garantizará una evaluación de izquierda a derecha como lo haría en los lenguajes de procedimiento.
Para su ejemplo, hicieron una prueba rápida:
Creado el UDF escalar de valor para invocar la división por cero error:
CREATE FUNCTION getMyFunction
(@MyValue INT)
RETURNS INT
AS
BEGIN
RETURN (1/0)
END
GO
Ejecutar la consulta siguiente no me dio un error de Divide by zero error encountered
.
DECLARE @test INT
SET @test = 1
SET @test = ISNULL(@test, (dbo.getMyFunction(1)))
SELECT @test
Cambio de la SET
el cuadro de abajo me dio el error Divide by zero error encountered.
. (Introducido un SELECT
en ISNULL
)
SET @test = ISNULL(@test, (SELECT dbo.getMyFunction(1)))
embargo, con valores en lugar de las variables, nunca me dio el error.
SELECT ISNULL(1, (dbo.getMyFunction(1)))
SELECT ISNULL(1, (SELECT dbo.getMyFunction(1)))
Así que a menos que realmente averiguar cómo el optimizador está evaluando estas expresiones para todas las permutaciones, que sería seguro para no depender de las capacidades de cortocircuito de T-SQL.
Puede agregar una declaración 'PRINT' a su función y descubrirlo usted mismo. –
@JarrettMeyer Utilicé esa técnica para aprender a programar en mi niñez, pero no se aplica hoy en día porque no se sabe qué es el detalle de la implementación y cuál es el comportamiento documentado. Aprender es cada vez más difícil :(solo digo ... –
@JarrettMeyer, 'PRINT' no es aceptable en un udf. – Kash