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 🙂
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,
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
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.
Excelente tu aportación y muy agradable tu redacción.
Felicidades y sigue aqui con mucho de tu experiencia.
MUY BUENO!
MUY BUENO TU COMENTARIO, SOLO QUIERO SABER SI SQL, TIENE COMPATIBILIDAD CON BORLAND DELPHI.
hola quiero saber como extraer datos de mysql a sql server 2005…
gracias
Mi consulta es la siguente:
Tengo un archivo MDF de SQL Server 2008 Express es posible adjuntarlo a un SQL Server 2005 Standar
Mi respuesta es la siguiente:
No.
Compatibilidad sql server con vista
Consulta.
Si cambio la compatibilidad a 2000 puedo crear ostras instancias que corran con 2008 o nativamente??
gracias desde ya por tu respuesta.