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

Escrito por un humano, no por una IA