Intercalación [Collation] en SQL Server

Es sabido que SQL Server nos permite establecer propiedades para configuraciones regionales, codigos de pagina, soporte multilingüe, etc. para el tema de intercionalizacion, por ejemplo cuando en algun momento quisieramos que solo en una columna de nuestra tabla tenga sencibilidad para mayusculas y minusculas, mas en toda nuestra BD no sea necesario eso.

Ahora como una pequeña introduccion al tema, SQL Server puede manejar 4 niveles de Intercalacion :

  • Nivel de Servidor
    Personalmente considero que es la principal ya que de aqui hereda toda configuracion de Intercalacion que no se indique de manera explicita.
  • Nivel de Base de Datos
    Puede heredar del Servidor o se puede escoger una diferente.
  • Nivel de Columna
    Se define al momento de crear la tabla o columna
  • Nivel de Expresión
    Son expresiones utilizadas en Transact-SQL

Ahora comento un poco como conoci esto: sucedio tras el pase de nuestra BD de desarrollo, hacia el ambiente de pruebas del cliente.
En nuestro servidor de desarrollo tenia instalado el SO en español y la SQL Server tambien en español, pero en el Servidor de desarrollo del cliente, tenia el SO en Ingles y el SQL Server tambien en ingles.
Ahora levantamos el Backup todo bonito y terminamos algunas configuraciones posteriores y ejecutamos la aplicacion. Llego un momento en que la aplicacion no funcionaba(y ahi salta la grandiosa frase, "pero en mi maquina si funcionaba..." (risas xD)). El error que mostraba la aplicacion era :

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Modern_Spanish_CI_AS" in the equal to operation.

y son en esos momentos en los que: "what???? y eso de donde salio????smile_confused". El error saltaba cuando se llamaba a un Store Procedure que creaba y consumia tablas temporales [#Table], y pues cuando trabajabamos con tablas temporales estas no se crean en el vacio se crean en la System Table tempdb y cuando miramos en sus propiedades ooohhh sorpresa "SQL_Latin1_General_CP1_CI_AS" chess eh aqui el problema y es que sucedio que el administrador de ese server solo le dio Next Next Finish, punto negativo para ellos (o tambien puede ser por que nosotros no le indicamos nada smile_sarcastic punto negativo pa nosotros...plop!), el tema fue que cogio todas las configuraciones por default y las asigno a las System Tables, si no se le indica al Instalador nada sobre la Intercalacion pues este coge la Intercalacion del Sistema Operativo.

Pero por con esto no quiere decir que sea definitivo, hay maneras de modificarlas, claro siendo conscientes que hay peligro por la compatibilidad con la nueva Intercalacion.


Para hacer las consultas nos niveles de Intercalacion :

---------------------------------------------------------------------
-- A TRAVEZ DE TRANSACT-SQL PODEMOS HACER CONSULTAS PARA VERIFICAR --
-- LA INTERCALACION EN NUESTRO SERVIDOR: --
-- (segUn el lenguaje de instalación, varia la consulta --
---------------------------------------------------------------------
-- Para Consultar la Intercalacion a nivel de Servidor

SELECT CONVERT(varchar, SERVERPROPERTY('intercalación'))
SELECT CONVERT(varchar, SERVERPROPERTY('collation'))

-- Para consultar a nivel de base de datos:

SELECT CONVERT(varchar, DATABASEPROPERTYEX('pubs', 'intercalación'))
SELECT CONVERT(varchar, DATABASEPROPERTYEX('pubs', 'collation'))

-- Tambien podemos usar el SP del Sistema y mirar en la columna [Status]

Exec sp_helpdb pubs

-- Con el SP del Sistema sp_help, podemos ver las intercalaciones en las columnas.

USE pubs
EXEC SP_HELP authors

-- Para consultar la lista de todas las intercalaciones SQL y Windows.

SELECT * FROM :fn_helpcollations()

-- Para consultar las propiedades de una intercalación.

SELECT COLLATIONPROPERTY('Latin1_General_CS_AI', 'codepage')
SELECT COLLATIONPROPERTY('Modern_Spanish_CS_AI_KS_WS', 'codepage')



Para modificar podemos usar estas lineas:




-- Para modificar la Intercalacion a nivel de Base de Datos
ALTER DATABASE DbPrueba COLLATE SQL_Latin1_General_CP1_CI_AS

-- Para modificar al Intecalacion a nivel de Columna
ALTER TABLE tblCiudad ALTER COLUMN f_pais varchar (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL



Ahora tambien se puede hacer la modificacion a nivel de Servidor, pero tenemos 2 opciones :

1.- Recontruir la Master, pero esto no es tan sencillo como los anteriores, para SQL Server2k se puede utilizar la herramienta REBUILDM, para SQL Server2k5 hay que hacerlo desde la media de instalacion, indicando en el wizard de modificacion (asi dice en la MSDN Library, pero personalmente fue el unico que no encontre, seguire intentando y luego lo posteo).


2.- Instalar Nuevamente el Servidor de BD, jajaja si pues realmente escoges esta opcion en casos extremos o si quieres asegurarte que funcione bien! xD


ventana_Colletion



Luego de realizar las modificaciones la aplicacion funciono tranquila smile_regular 
Pdta. Solo como recomendacion, nunca instalen Next Next Finish, lean hasta el Contrato de Instalacion antes de pulsar Next(Siguiente), y traten de seleccionar la instalacion Personalizada(Custom) ya que con esto podemos configurar las cosas como deseemos y no perdamos tiempo valioso reconfigurando o causando funcionamientos inesperados.


Links de Interes:


[Parte de este post es resumen de este enlace y que me sirvio como guia para solucionar mi inconveniente]

http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/MTJ_2511/default.aspx



http://technet.microsoft.com/es-es/library/ms143269(SQL.90).aspx


http://geekswithblogs.net/mskoolaid/archive/2005/12/17/63413.aspx


Bytes!

2 comentarios:

Anónimo dijo...

uuuff mismo problema que tenemos ahora..
veremos como nos va con lo leido
gracias de antemano
y saludos.

Anónimo dijo...

Muchas gracias amigo, me ha servido de mucho.
Gracias por compartir el conocimiento.
Salu2 desde Mexico.

 


« code name... Jonathan »