La siguiente consulta no devuelve ningún resultado y no hay error en SQL Server 2008 (probado en SP1), puede ejecutarla en cualquier base de datos, incluso maestro:Roles de paréntesis en SQL Server ¿SELECCIONAR consultas?
WITH computed_table (id) AS
(
SELECT id FROM this_table_does_not_exist
)
(SELECT * FROM computed_table)
UNION
(SELECT * FROM another_table_that_does_not_exists)
En SQL Server 2005, se produce un error debido a que el las tablas no existen Usted obtener también consigue un error si se quita algunos paréntesis:
WITH computed_table (id) AS
(
SELECT id FROM this_table_does_not_exist
)
SELECT * FROM computed_table
UNION
(SELECT * FROM another_table_that_does_not_exists)
El mismo tipo de problemas aparece con tablas reales: en algunas ocasiones, la consulta no devuelve ningún resultado, y si usted hace algunos ligeros cambios , como eliminar un espacio o un retorno de carro, funciona de nuevo ...
Creo que puede haber un problema en la consulta, porque SELECCIONAR entre paréntesis puede interpretarse como una expresión en lugar de una subconsulta, como en this page. Pero eso debería al menos devolver un error.
¿Echo de menos algo?
Editar 26/06/2010: Ejecuté algunas sesiones de creación de perfiles, con los siguientes resultados.
Para la consulta anterior, la secuencia de eventos es:
- Excepción (Error: 208, nombre de objeto no válido)
- SQL: BatchStarting
- SQL: StmtStarting
- SQL: BatchCompleted
Para la consulta sin paréntesis:
- Excepción (Error: 208)
- SQL: BatchStarting
- SQL: StmtStarting
- Excepción (Error: 208)
- Error del usuario Mensaje (nombre de objeto no válido 'this_table_does_not _exist')
- SQL : BatchCompleted
Para una consulta de trabajo:
- SQL: BatchStarting
- SQL: StmtStarting
- plan de presentación Todo
- SQL: StmtCompleted
- SQL: BatchCompleted
También me encontré con una de las consultas con tablas reales que me está causando el mismo problema.La secuencia de eventos es:
- SQL: BatchStarting
- SQL: StmtStarting
- SQL: BatchCompleted
no temprana "Excepción" => existen las tablas. No "SQL: StmtCompleted" => significa que se produjo un error, no pude ver ninguna otra razón por la que este evento no se haya planteado. No "Showplan All" => significa que el error ocurre antes (o cuando) se calcula el plan de ejecución. Puede ser causado por la combinación de cte y paréntesis.
Plantearé el problema con el soporte de Microsoft la próxima semana.
¿ha intentado cambiar los select * 's a los nombres de las columnas reales? – DForck42
¡qué pregunta tan maravillosa! Primero, en 2008, también obtiene errores en la segunda declaración. Además, no veo que la declaración de UNIÓN tenga algo que ver con el comportamiento extraño, ya que la eliminación de la unión y la segunda selección no parece cambiar los resultados. Un dato interesante: cuando uso el primer enunciado y solicito un plan de ejecución estimado, no recibo ningún plan. Voy a correr un rastro ahora. HABLARÉ CONTIGO MÁS S TARDE. – MaasSql
También publicará el código al que hace referencia: "También ejecuté una de las consultas con tablas reales que me causa el mismo problema". Además, por pura curiosidad, ¿estás tratando esto como un bloqueador para el desarrollo/un problema de producción? Si es así, parece que la solución sería no seguir el patrón cte, luego el paréntesis. – MaasSql