jueves, 8 de noviembre de 2007

Problemas Del Lenguage En SQL Server 2005

Siendo esta mi primera entrega de este nuevo Blog, quisiera poder solucionar ese típico problema del migrador de aplicaciones que suele tener un problema muy común: Lenguage en SQL Server 2005. Y es que cualquiera que sea nuestro caso de migración, la vida (Cambio a un nuevo servidor por ejemplo) o el destino (Cambio de ambiente de mi aplicación por ejemplo) en ocasiones cometemos un error que nos puede causar más de un inconveniente!!.

El caso es: En nuestro nuevo servidor instalamos sistema opertativo, los nuevos paquetes, entre esos el servidor de SQL 2005, los componentes utilizados por mi aplicación, la aplicación en si y luego la levantamos (A nuestra aplicación por supuesto) hasta ahi 0 problemas, comenzamos a probar el funcionamiento de la aplicación y se nos ocurre realizar una consulta que tenga que ver con fechas...."ERROR con el formato de fechas 'mm/dd/yyyy'". Pero que pasó???? lo primero que se nos viene a la mente es: algo con el Lenguage del sistema operativo, ir a configuración regional y de idiomas y probar. Pero NO!!! ese realmente no es el causante de nuestras penas, el verdadero causante fue el personaje (normalmente nosotros mismos) que instaló el paquete de SQL Server 2005 con un lenguaje distinto al de el servidor de origen. Que hacer entonces???? Pues instalar todo de nuevo?? esa sería una solución, pero seguramente no las más adecuada.

Primero que nada...en que formato de fechas se encontraba nuestra aplicación antiguamente??? Pues bien para este caso el formato de las fechas que se encontraba originalmente será 'dd/mm/yyyy'. Y ahora queremos hacer una consulta y nos sale el error de 'mm/dd/yyyy'???
Vamos a comenzar nuestro estudio entonces.

El formato de fechas esta completamente atado al lenguaje con el que esta corriendo nuestro servidor SQL, NO al lenguaje de instalación, ni con el que leemos las opciones de las herramientas de sql, ni con el collation!!! Es el lenguaje que esta corriendo nuestro servidor!!! Como averiguamos ese dato??? pues hay que correr el siguiente script sql en nuestro famoso Microsoft Sql Server Managmente Studio (SQL SMS pa la proxima):

select @@language

Y obtendremos ese lenguaje, en mi caso: us_english. Listo ahora sé que el lenguaje con el que corre mi servidor es el inglés. Ahora como sé que formato de fechas es el que está atado a mi servidor?? corramos entonces el siguiente query!! o store procedure (sp pa la proxima) del sistema.

sp_helplanguage 'us_english'

Obtendremos toda la información acerca de este idioma. Entre esos su código, su formato de fecha, el nombre, su alias, sus nombres de meses, sus nombres de meses cortos, etc. Por cierto si corremos solo el sp sp_helplanguage sin parametros el resultado es la información acerca de todos los lenguajes posibles instalados en nuestro SQL 2005. Pero para muestra un botón:






Aca esta el resultado de nuestra consulta completa.



"Lindo hasta ahora todo lindo, pero no se me ha solucionado absolutamente NADA!!!!" si lo sé, ahora vamos. Una solución parcial sería utilizar la siguiente sentencia antes de correr cualquier sentencia SQL de nuestra aplicación:

set dateformat dmy

Sin emabargo como notarán para este caso es una solución muy parcial, muy superficial!!! Nos tocaría cambiar todas las sentencias para que antes de que corran ellas, primero corra nuestra sentencia set date format dmy.

Bueno esta no fue!!! veamos que más podríamos hacer!!! Vamos a utilizar la siguiente sentencia, que es una solución menos parcial!!! Voy a setear lenguaje español porque ese lenguaje está atado con la fecha en el formato que yo quiero 'dd/mm/yyyy' o dmy -sino me creen ejecuten el sp sp_helplanguage-.

SET LANGUAGE Español

Hey ahora funcionan todas las consultas SQL!!! Todas las sentencias se ejecutan!!! Que bien!! Arreglado el problema!! Ejecuto el select @@language y me dice ESPAÑOL!!! POR FIN!!! Pues talvez no necesariamente. Probemos: bajemos los servicios SQL o ingresemos con un usuario diferente a la base de datos y hagamos las consultas!!!Pues otra vez dejo de funcionar :'(
sigue saliendo us_english como respuesta a mi select @@language!!!
Que pasó??? pues esta sentencia solo mantiene el cambio del lenguaje para la sesión del usuario conectado en ese momento a la base de datos, por lo tanto al bajar los servicios o al conectarse otro usuario distinto nuestra configuración se pierde. Entonces la solución parcial para nuestro caso sería correr la sentencia set language automáticamente después de que un usario se conecte a la base. Pero sigue siendo una solución muy parcial para mi problema, menos que la anterior pero igual parcial!!!

Bueno, entonces ahora si viene la de verdad verdad!!!. Entramos al SQL SMS (ya saben a que me refiero!!! Sql Server Managment Studio!!!) En el lado izquierdo se encuentra nuestro árbol explorador de objetos, encontramos el nombre del servidor de nuestra base y/o el nombre de mi instancia. Clic derecho -> Propiedades











Luego voy a la pestaña de avanzados, y veo la opción de lenguaje por defecto y entonces cambio y escojo el de mi elección!!! En mi caso será español....para muestra otro botón!!!




Si esta es la ventana de las que les hablaba. Entonces escogeremos el lenguaje de nuestro servidor!!! OJO que es de nuestro servidor, es decir también modifica el lenguaje de todas las bases de datos alojadas en este servidor (cuidado!!! por arreglar una dañamos 3!!!) Pero si solo tenemos una BD como en nuestro caso, entonces quedará perfecto!!!!. Listo el lenguaje de nuestro servidor esta modificado!!! Este será el lenguaje por defecto de todos los nuevos logins creados!!! todos los NUEVOS logins creados!!!. Si falta entonces un paso, cambiar el de los logins ya creados!!.

En nuestro object explorer vamos a la carpeta de seguridad y escojemos logins. Encima del grupo o usuario clic derecho propiedades y en la pestaña de default lenguage escojemos el lenguaje deseado, en nuestro caso el Español!!.



Repetimos el proceso para todos los logins de nuestro servidor, o si tenemos muchos hacemos un script que modifique esta propiedad a todos los logins.






Ahora si probemos, TODO SIRVE ahora si TODO sirve. reiniciamos los servicios, entremos con cualquier login :) TODO SIRVE.

Espero que les sirva, y espero también sus comentarios, preguntas y sugerencias!!! Proximas ediciones tendrán que ver con el maravilloso mundo del desarrollo!!! Auqnue siempre habrá una que otra de Bases de Datos!!! Hasta pronto!!!

26 comentarios:

Anónimo dijo...

Excelente Articulo, llevaba 4 horas buscando solución a este problemas.

muchas gracias. kicedo@hotmail.com

Anónimo dijo...

Excelente! Articulo, te felicito lleva bastante rato buscando esta solucion. Muchisisismas gracias.

Anónimo dijo...

Excelente, te felicito en realidad te felicito es un grandioso articulo. Muchas Gracias!

Anónimo dijo...

Hola que tal,

Existe alguna manera de hacer que el formato de un campo fecha se muestre de manera distinta solo para la vista cuando se hace un select?? Por ejemplo:

select nombre, fecha from usuario

y el resultado sale como

yyyy/mm/dd hh:mm:ss

Pero yo quiero que me muestre el resultado con un formato distinto.

Anónimo dijo...

dentro del select utiliza una función que se llama convert. EJ:

Select CONVERT(nvarchar(30), GETDATE(), 126) as FechaHoy


Donde el 126 es un código que define la locación de un formato de fecha determinado, para ver más opciones de código te recomiendo que veas en los books on line!!!

Unknown dijo...

Muy buen artículo, pero hay una cosa que no me ha quedado clara. Existe alguna manera de cambiar el formato de la fecha de forma permanente sólo para una base de datos?

Gracias

Anónimo dijo...

Bueno lei el articulo y creo que esta barbaro pero mi configuracion estaba bien de entrada ahora quiero saber como hago esto

strsql = "select fechab from configuracion"
strsql = strsql & " where fechab= #" & Format(Date, "dd/mm/yyyy")& #


he probado varias cosas cambiando de formato utilizando "dd/mm/yyyy hh:mm:ss" peor no lo logro con vb6 me pueden ayudar ????
Gracias

rybnet dijo...

Esta muy bueno tu articulo sobre todo que esta al detalle, me ayudo bastante.
gracias

Anónimo dijo...

llevo 2 dias buscando soluciones de este problema y porfin pude encontrar algo que valga la pena.
mil gracias por la colaboración y el tiempo en crear este tuto.

Anónimo dijo...

Muchas gracias por tu artículo en verdad me ayudo mucho y gracias también por compartir tus conocimientos.

Anónimo dijo...

Nitido gracias eso era precisamente lo que andaba buscando man y habia pensado en lo del set language y set date pero me ahorraste hacer pruebas y ver que se resetearian gracias man.

saludos desde guatemala

Anónimo dijo...

Muy buenas, sé que llego un poco tarde, pero a día de hoy me ha surgido este problema y quisiera ver si me pueden ayudar. Mi problema es que el set dateformat ymd no funciona, no me cambia el formato de fecha, si luego vuelvo a mirar el sp_helplanguage 'español' me sigue saliendo igual que antes, como dmy.
No sé que puedo hacer y necesito importar unos datos al sql ya que estoy cambiando una base de datos de mysql a sql server. Si me pueden ayudar se lo agradeceré mucho.

Gracias de antemano. Dejo mi correo por si acaso: sergio@jobers.net

Tono Ayala! dijo...

Que tal Sergio, la solución está en el post. Debes cambiar el lenguage del servidor.

Saludos.

Anónimo dijo...

muchisimas gracias

Anónimo dijo...

Fráncamente espectacular... fueron varias horas buscando la respuesta, hasta que llegue aqui. Muchas gracias por aportar de esta manera con quienes comenzamos a sufrir en SQLSERVER.

Hice todo lo indicado y como tu dices ¡MAGIA!... todo funcionó perfecto.

Ya agregue tu blog a mis favoritos... saludos cordiales

Anónimo dijo...

Hola muy bien explicado, gracias por tu ayuda, saludos

Anónimo dijo...

Me sacaste de apuros, gracias por el aporte :).

Unknown dijo...

Excelente, por fin un aporte bueno bueno....

DXICAY dijo...

buenisimo, gracias, era facil pero no le hallaba :P

Alex dijo...

He escuchado sobre un programa. El ha sido en un sitio con los softwares - como reparar archivos sql .mdf. El programa ha terminado mis problemas muy con facilidad y de balde. Todavia sobre este programa mis amigos han estado contento de este utilidad. Ellos han dicho que con ayuda del instrumento ha economizado el tiempo. El utilidad ha demostrado sus posibilidades en guardar los datos de salidas como un solo archivo .pst o como un grupo de archivos .eml, .vcf y .txt.

Unknown dijo...

Excelente Articulo.. ya estaba apunto de llorar!.. ^^,! Saludos y nuevamente Gracias por tremenda ayuda!

alexander dijo...

que buena ayuda, duramos un buen rato tratando de solucionarlo

gracias

Anónimo dijo...

desde chile,muchas gracias, muy presiso tu aporte me ayudo mucho.

Anónimo dijo...

Increible!!!. a pesar del tiempo que llevan estas publicaciones, continúan siendo un Gran Aporte para quienes seguimos confiando en SQL Server 2005.

Muchas Gracias y felicitaciones a Todos por sus aportes.

afetuosamente,

paulo

Anónimo dijo...

Muchisimas gracias por las indicaciones...realmente me salvaste de un fin de semana aterrador... Excelente Tutorial !!!!!

Saludos desde Ecuador

Tono Ayala! dijo...

Muchas gracias, otro saludo desde Ecuador