Compatibilidad entre versiones de SQL Server - problema la ordenación ORDER BY y los prefijos

Bueno, he estado completamente "missing" durante 5 semanas. No es que me haya ido de vacacione (ojalá) sino que simplemente he tenido demasiado trabajo :-(

Retomo mi actividad blogera habitual con una cosa curiosa que me ha pasado recientemente y que estoy seguro de que a más de uno le podrá resultar útil.

Resulta que recientemente migramos una base de datos hecha con SQL Server 2000 a SQL Server 2005. Lo primero que hice una vez adjuntada al nuevo servidor fue poner el modo de compatibilidad con SQL Server 2005, es decir, hacer que se comportara nativamente como si siempre hubiera estado en esta última versión del SGBDR:

sp_dbcmptlevel 'MiBaseDatos', '90'

Este comando T-SQL hace que la BD indicada se comporte con el nivel de compatibilidad indicado, en este caso la versión 9.0 de SQL Server, o sea, la 2005.

El caso es que todo parecía ir estupendamente, pero una de las consultas empezó a fallar. Y se tratata de una consulta muy sencilla. No la voy aponer aquí porque forma parte del dominio de aplicación, pero para que nos entendamos la consulta era básicamente como esta:

SELECT Distinct Tabla1.campo1, COUNT(SR.ID) AS Total
FROM Tabla1
RIGHT JOIN Tabla2 SR ON Tabla1.ID = SR.ID
WHERE --Condiciones
GROUP BY tabla1.Campo1
ORDER BY SR.Total DESC

A la tabla2  le ponemos un alias 'SR' (en la consulta real tenía más sentido).

Bueno, el caso es que, de repente empezó a fallar con un error muy raro que decía algo sobre la ordenación, cuando la consult ano tiene absolutamente nada.

El asunto es que, si ponemos de nuevo la BD en modo de compatibilidad con SQL Server 2000:

sp_dbcmptlevel 'MiBaseDatos', '80'

De repente vuelve a funcionar sin problemas.

El problema viene porque SQL Server 2005 no permite prefijos en las cláusulas ORDER BY porque no permite que haya ambigüedad alguna en esos campos, y por lo tanto asume que no necesitas usar prefijo alguno. Total, que si no tenemos ambigüedades (todos nuestros campos del resultado son de nombres diferentes) entonces podemos poner la consulta sin el prefijo y todo funcionará sin problemas:

SELECT Distinct Tabla1.campo1, COUNT(SR.ID) AS Total
FROM Tabla1
RIGHT JOIN Tabla2 SR ON Tabla1.ID = SR.ID
WHERE --Condiciones
GROUP BY tabla1.Campo1
ORDER BY Total DESC

Es decir, al no haber ambigüedades funcionará en ambas versiones sin problemas. En la 2000 porque no hay ambigüedad y en la 2005 por el mismo motivo (no hay prefijo).

Total que es la típica cosa que te puede volver loco por una tontería si no lo ves enseguida como me pasó a mi :-(

En este artículo de Technet explican má diferencias de compatibilidad entre ambas versiones: http://technet.microsoft.com/en-us/library/ms178653.aspx

Espero que le sirva a alguien. En breve más :-)

Archivado en:
Comparte este post:

Comentarios

# Mary Arcia said:

Hola Jose M.!

Muy bueno tu aporte, porque la verdad no sabia que podias usar prefijos en las clausular ORDER BY, en particular, nunca los usaba, tal vez porque ignoraba todo esto o simple intuicion...

Bueno, gracias por la ayuda.

Saludos,

Tuesday, September 11, 2007 3:27 AM
# Alskare said:

En algún momento he tenido también problemas de ordenación y, al no tener los conocimientos que tienes tú para encontrar el error, siempre he optado por usar en el ORDER BY, el número de la columna.

Vamos, que mis consultas de SQL suelen ser ORDER BY 4,2,5

Tuesday, September 11, 2007 12:51 PM
# Juan Irigoyen said:

Una metida de pata mas, del equipo de desarrollo de Sql Server y que os parece que la función Identity ahora no se comporte igual que en sql 2000, si siguen asi voy a tener que pasarme a Oracle, DB2, MySQL o algo parecido, cada vez me causan mas problemas a la hora de migrar mis aplicaciones, a ver si se ponen las pilas y empiezan a pensar un poco mas en los desarrolladores a los que tanto alaban... y en mejorar los productos que tienen en lugar de inovar con cosas inecesarias.

Tuesday, September 11, 2007 10:08 PM
# Patricia Rodriguez said:

Excelente tu aportación y muy agradable tu redacción.

Felicidades y sigue aqui con mucho de tu experiencia.

Wednesday, April 23, 2008 10:44 PM
# suirik said:

MUY BUENO!

Wednesday, July 23, 2008 8:20 PM
# oSCAR said:

MUY BUENO TU COMENTARIO, SOLO QUIERO SABER SI SQL, TIENE COMPATIBILIDAD CON BORLAND DELPHI.

Monday, August 11, 2008 6:34 PM
# agl said:

hola quiero saber como extraer datos de mysql a sql server 2005...

gracias

Monday, September 08, 2008 10:45 PM
# Victor Chupillón said:

Mi consulta es la siguente:

Tengo un archivo MDF de SQL Server 2008 Express es posible adjuntarlo a un SQL Server 2005 Standar

Saturday, October 03, 2009 12:10 AM
# José M. Alarcón Aguín said:

Mi respuesta es la siguiente:

No.

Saturday, October 03, 2009 10:56 AM
# Jose luis said:

Compatibilidad sql server con vista

Friday, February 05, 2010 6:03 PM
# carlos carmona said:

Consulta.

Si cambio la compatibilidad a 2000 puedo crear ostras instancias que corran con 2008 o nativamente??

gracias desde ya por tu respuesta.

Thursday, April 29, 2010 10:23 PM