2012-06-27 12 views
16

Quiero consultar SQL Server o cortocircuitoO Operador de cortocircuito en SQL Server

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.

SQL Server operador OR: si la función de cortocircuito

GRACIAS

+5

no es ninguna garantía ** ** alguno sobre cómo y qué partes de una condición o '' se evalúan primero (o una alto). T-SQL es ** NO ** como C# de esa manera. Usted ** no puede ** confiar en un cortocircuito booleano. –

+0

'¿Por qué? 1 = 1 y @ id = 'x' es verdadero '- es ** o ** en realidad, no ** y **. –

+0

Aquí, en este INSERT @tempTable (id) values ​​(1), falta INTO. – vijay

Respuesta

14

Dentro de SQL, no hay ningún requisito que una cláusula o se rompe antes de tiempo. 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.

+0

O cortocircuito es Mis dudas, pero mi oficina de codificación sql es ((@ id es NULL O id = id) AND (@name IS NULL O name = @ name)) Me gustaría saber si el cortocircuito Debido a esto, la eficiencia del proceso de decisión Para hacerlo, simplemente reutilice el plan de consulta – NotTwoWayStreet

5

sólo tropezó sobre esta cuestión, y que ya habían encontrado este blog-entry: http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/

El servidor SQL es gratuito para optimizar una consulta en cualquier lugar que considere adecuados, por lo que en el ejemplo dado en la entrada del blog, no se puede confíe en el cortocircuito.

Sin embargo, un CASE aparentemente está documentado para evaluar en el orden escrito - verifique los comentarios de esa publicación de blog.

-1

Es pero obvio que MS SQL Server soporta la teoría de circuitos corto, para mejorar el rendimiento, evitando la comprobación de innecesario,

Apoyando Ejemplo:

SELECT 'TEST' 
WHERE 1 = 'A' 

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

Aquí, el primer ejemplo podría resultar en error ' La conversión falló al convertir el valor varchar 'A' al tipo de datos int. '

Mientras que el segundo funciona fácilmente ya que la condición 1 = 1 se evalúa como VERDADERO y por lo tanto la segunda condición no se ejecuta en absoluto.

Adicionalmente

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

aquí la primera condición evaluaría a falso y por lo tanto el DBMS iría a la segunda condición y otra vez obtendrá el error de la conversión como en el ejemplo anterior.

NOTA: I escribió el ESTADO ERRÓNEA sólo para darse cuenta WEATHER la condición se ejecuta o CORTOCIRCUITO si los resultados de la consulta en ERROR se entiende la condición ejecutados, CORTOCIRCUITO DE OTRO MODO.

explicación simple

Considérese,

WHERE 1 = 1 OR 2 = 2 

como primera condición se está evaluado a VERDADERO, su sentido evaluar la segunda condición, porque su evaluación en cualquier valor no afectaría el resultado en absoluto, por lo que es una buena oportunidad para que el Servidor SQL guarde el tiempo de Ejecución de Consulta salteando la verificación o evaluación innecesaria de la condición.

en caso de "OR" si primera condición se evalúa a TRUE toda la cadena conectado por "OR" habría considerado como evaluado a verdadero sin evaluar otros.

condition1 OR condition2 OR ..... OR conditionN 

si la condición1 se evalúa como verdadera, descanse todas las condiciones hasta que la condiciónN se omita. En palabras generalizadas en la determinación de la primera TRUE, todas las demás condiciones vinculadas por O se omitirán.

considerar la segunda condición

WHERE 1 = 0 AND 1 = 1 

como primera condición es conseguir calificar con certitud a FALSO su sentido evaluar la segunda condición, porque su evaluación en cualquier valor no afectaría el resultado en absoluto, así que de nuevo es una buena oportunidad para que el Servidor SQL guarde el tiempo de Ejecución de Consulta salteando la verificación o evaluación innecesaria de la condición.

en caso de "AND" si primera condición se evalúa a FALSO toda la cadena conectado con el "AND" habría considerado como evaluados como FALSE sin evaluar otros.

condition1 AND condition2 AND ..... conditionN 

si el condición1 se evalúa a FALSO, descansar todas las condiciones hasta conditionN se omitiría. En palabras generalizadas en la determinación de la primera FALSE, todas las demás condiciones vinculadas por AND se omitirán.

MISMOS, un programador WISE DEBE programa siempre LA CADENA DE LAS CONDICIONES DE TAL MANERA QUE, MENOS caro o MOST eliminando afección se evalúa en primer lugar, o los arreglos LA CONDICIÓN DE TAL MANERA que puede tomar beneficio máximo de CORTOCIRCUITO

Gracias y Saludos,

Rk_Hirpara

+3

Motivo de desestimación: pruebe siempre las cosas en un servidor real, con un conjunto de datos razonable.Por ejemplo, pruebe esta cláusula where más realista en un campo de caracteres, donde isnumeric (fieldname) = 1 Y convert (decimal, fieldname) <= 0 - encontrará que sufre un error de conversión en filas donde isnumeric = 0, aunque técnicamente no debería necesitar evaluar la segunda condición en tales filas. – Jasmine

Cuestiones relacionadas