2011-06-28 17 views
8

Codifiqué manualmente un SQL simple en SQL Server 2008 como se muestra a continuación;SQL Server 2008 Query Editor cambia la lógica de consulta

SELECT * FROM Tab1 WHERE A='1' AND (B='1' OR C='1');

ser perezoso abrí esta consulta en el Editor de consultas para validar la sintaxis y presioné OK en el cuadro de diálogo sin realizar ningún cambio.

me di cuenta que el Editor de consultas había cambiado mi consulta a:

SELECT * FROM Tab1 WHERE A='1' AND (B='1') OR (C='1');

claramente esto cambia la lógica del SQL y devuelve resultados diferentes dependiendo de cuál se ejecuta.

Uso de forma rutinaria el Editor de consultas para validar mi sintaxis en consultas complejas. Por eso estaba un poco preocupado de que un cambio tan sutil como este se fuera a unir, pero cambiaría el resultado.

¿Es esta una característica del diseñador? ¿Hay algo que pueda hacer para cambiar este comportamiento?

EDITAR: Gracias por señalar que los cambios realizados por el editor no son los mismos que los de arriba, pero aún la consulta se modifica aunque los resultados son los mismos.

Gracias

+0

Hombre, eso es un pensamiento aterrador si sus consultas cambiantes! – Limey

+0

Hice una comprobación, y se resolvió correctamente para mí: SELECCIONAR * FROM Tab1 DONDE (A = '1' Y B = '1') O (A = '1' Y C = '1') ;. Probado con la versión 2008, por lo que podría depender de otra cosa. – MicSim

+0

"presionó Aceptar en el cuadro de diálogo" No obtengo ningún "OK" cuando compruebo la sintaxis. – Jimbo

Respuesta

3

Intenté replicar esto en el Query Designer y tuve un resultado ligeramente diferente. He escrito lo mismo que usted:

SELECT * FROM Tab1 WHERE A='1' AND (B='1' OR C='1'); 

Y tengo esto:

SELECT  * 
FROM   Tab1 
WHERE  (A = '1') AND (B = '1') OR 
         (A = '1') AND (C = '1') 

Tengo que decir que el resultado es el mismo, pero todos podemos ver un camino peligroso aquí. Además, no me gustó la replicación (A = '1'). ¡Diablos, quiero el código de cómo lo codifiqué!

Una palabra al sabio: I nunca formulé mis consultas en SQL Server Management Studio. ¿Has visto lo que hace con el código de tu vista? Lo odio. Simplemente codifico en otro lugar y pego los SMS cuando termine.

+0

Sí, tanto Adrian como MicSim están en lo cierto. Creo que salté las armas un poco con pánico, DEBIDO a la nueva condición duplicada con mis corchetes desordenados como usted señaló. Sin embargo, será cauteloso. – Sivakanesh

2

La declaración

SELECT * FROM Tab1 WHERE A='1' AND (B='1' OR C='1') 

resuelve para mí:

SELECT * FROM Tab1 WHERE (A='1') AND (B='1') OR (A='1') AND (C='1') 

Ésta es sorprendentemente correcta, como en SQL Server TSQL el operador AND tiene prioridad sobre OR . Eso significa que lo anterior es la misma como la siguiente, porque el AND -operator se evalúa antes de la OR -operator:

SELECT * FROM Tab1 WHERE ((A='1') AND (B='1')) OR ((A='1') AND (C='1')) 

Y esto es lo mismo como la declaración inicial que se utiliza en la pregunta.

Ver Operator Precedence (Transact-SQL) para más detalles.