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 🙂

Sin categoría

11 thoughts on “Compatibilidad entre versiones de SQL Server – problema la ordenación ORDER BY y los prefijos

  1. 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,

  2. 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

  3. 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.

  4. Consulta.

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

    gracias desde ya por tu respuesta.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *