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 :-)

💪🏻 ┬┐Este post te ha ayudado?, ┬┐has aprendido algo nuevo?
Pues NO te pido que me invites a un caf├ę... Te pido algo m├ís f├ícil y mucho mejor