O Cortocircuito del operador en SQL Server

Quiero consultar SQL Server O cortocircuito

Código:

DECLARE @tempTable table ( id int ) INSERT @tempTable(id) values(1) DECLARE @id varchar(10) SET @id = 'x' SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int 

¿Por qué? 1 = 1 y @ id = ‘x’ es verdadero.

Operador SQL Server O: si la función de cortocircuito?

GRACIAS

Dentro de SQL, no hay ningún requisito de que una cláusula OR salga antes. En otras palabras, depende del optimizador si se verifican ambas condiciones simultáneamente. No soy un experto en el optimizador MSSQL, pero he visto instancias donde el optimizador tiene y no ha cortocircuitado una cláusula OR.

Acabo de tropezar con esta pregunta, y ya había encontrado esta entrada de blog: http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/

El servidor SQL tiene la libertad de optimizar una consulta en cualquier lugar que le parezca adecuado, por lo que en el ejemplo dado en la publicación del blog, no puede confiar en un cortocircuito.

Sin embargo, aparentemente se ha documentado que un CASE se evalúa en el orden escrito; verifique los comentarios de esa publicación en el blog.

Es obvio que el servidor MS Sql admite la teoría de cortocircuitos, para mejorar el rendimiento al evitar las comprobaciones innecesarias.

Ejemplo de apoyo:

 SELECT 'TEST' WHERE 1 = 'A' SELECT 'TEST' WHERE 1 = 1 OR 1 = 'A' 

Aquí, el primer ejemplo daría como resultado el error “La conversión falló al convertir el valor varchar ‘A’ al tipo de datos int ‘.

Mientras que el segundo se ejecuta fácilmente ya que la condición 1 = 1 se evaluó a TRUE y, por lo tanto, la segunda condición no se ejecuta en absoluto.

Además

 SELECT 'TEST' WHERE 1 = 0 OR 1 = 'A' 

aquí la primera condición se evaluaría como falsa y, por lo tanto, el DBMS elegiría la segunda condición y nuevamente obtendrá el error de conversión como en el ejemplo anterior.

NOTA: ESCRIBIÉ LA CONDICIÓN ERRÓNEA SOLO PARA CONOCER EL TIEMPO. LA CONDICIÓN SE EJECUTÓ O CORTOCIRCUITO SI LA PREGUNTA RESULTA EN ERROR SIGNIFICA LA CONDICIÓN EJECUTADA, CORTOCIRCUITADA DE OTRA MANERA.

EXPLICACIÓN SIMPLE

Considerar,

 WHERE 1 = 1 OR 2 = 2 

como la primera condición se evalúa como VERDADERO , no tiene sentido evaluar la segunda condición porque su evaluación en cualquier valor no afectaría el resultado, por lo que es una buena oportunidad para que el Servidor SQL guarde el tiempo de ejecución de la consulta omitiendo una verificación o evaluación de condición innecesaria .

en el caso de “O” si la primera condición se evalúa como VERDADERO, toda la cadena conectada por “O” se consideraría evaluada como verdadera sin evaluar otras.

 condition1 OR condition2 OR ..... OR conditionN 

si la condición1 se evalúa como verdadera, descanse todas las condiciones hasta que se omita la condiciónN. En palabras generalizadas al momento de la determinación del primer VERDADERO , todas las demás condiciones vinculadas por OR se omitirán.

Considera la segunda condición

 WHERE 1 = 0 AND 1 = 1 

como la primera condición se evalúa como FALSA, no tiene sentido evaluar la segunda condición porque su evaluación en cualquier valor no afectaría en absoluto el resultado, así que nuevamente es una buena oportunidad para que el servidor SQL guarde el tiempo de ejecución de la consulta omitiendo una verificación o evaluación de condición innecesaria .

en el caso de “Y” si la primera condición se evalúa como FALSO, toda la cadena conectada con “Y” se considerará como FALSA sin evaluar otras.

 condition1 AND condition2 AND ..... conditionN 

si la condición1 se evalúa como FALSA , descanse todas las condiciones hasta que la condiciónN sea ​​omitida. En palabras generalizadas al momento de la determinación del primer FALSO , todas las demás condiciones vinculadas por AND se omitirán.

POR LO TANTO, UN PROGRAMADOR WISE DEBE SIEMPRE PROGRAMAR LA CADENA DE CONDICIONES DE FORMA QUE, MENOS COSTOSA O LA CONDICIÓN MÁS ELIMINATORIA SE EVALUE PRIMERO, O DISPONER DE LA CONDICIÓN DE FORMA QUE PUEDA APROVECHAR AL MÁXIMO EL CORTOCIRCUITO

Gracias y saludos,

Rk_Hirpara

    Intereting Posts