Blog gratis
Reportar
Editar
¡Crea tu blog!
Compartir
¡Sorpréndeme!
img
img

 

 

SQL Server
Blog. (Apuntes y Recopilaciones) por Norman M. Pardell

img
img
31 de Marzo, 2011 · Collation

Como modificar la Intercalación (Collation) en SQL Server

 La Intercalación (Collation), solo afecta a los campos de texto, interfiriendo en sus ordenaciones y comparaciones, ya que es la forma de representar o almacenar cada carácter.

 

Intercalación (Collation) de la Instancia

 La configuración de collation (intercalación) de SQL Server depende del tipo de instalación. Normalmente, se debe elegir un collation de SQL Server que admita la configuración regional del sistema de Windows que más se suela usar en la organización. El programa de instalación de SQL Server detecta automáticamente la configuración regional del sistema de Windows y selecciona el collation de SQL Server adecuado. Para mantener la compatibilidad con las versiones anteriores, el collation del idioma inglés (EE.UU.) predeterminada es SQL_Latin1_General*.

 Con el collation, lo que estamos definiendo, es el orden alfabético, distinciones si las hubiere entre mayúsculas y minúsculas, juego de caracteres..., para el uso de las consultas sobre nuestras bases de datos.

  Tecnicamente, las intercalaciones de SQL Server controlan lo siguiente:

A.- La página de códigos que se utiliza para almacenar datos no Unicode en SQL Server.

B.- Las reglas que rigen la forma en que SQL Server ordena y compara los caracteres que se almacenan en tipos de datos no Unicode.

 A modo de ejemplo y dicho de otro modo: Cuando se ejecuten consultas, donde no se contemplen las diferentes intercalaciones de los campos que cruzan datos entre diferentes tablas, con distinto collation, se producirá un error. Del mismo modo, en consultas que hacen uso de la base de datos tempdb, creando tablas temporles por defecto (sin indicar el collation), y usado join contra ellas, ya que dichas tablas se crearan con el collation de la tempdb que es el collation del servidor (Instancia de SQL), siendo este diferente al de la base de datos de usuario, se producirá un error… a menos que en la sentencia join indiques el collate (-"se explica mas adelante".)

Para consultar la intercalación de una instancia SQL Server, utiliza la siguiente función SERVERPROPERTY:

 

SELECT CONVERT (varchar, SERVERPROPERTY('collation'))

 

 

El collation de una base de datos se puede obtener con la consulta:

 

SELECT CONVERT (varchar, DATABASEPROPERTYEX('database_name','collation'))

 Una forma de cambiar el collation a nivel de instancia: http://msdn.microsoft.com/en-us/library/ms179254.aspx Y

 Pero, en ocasiones tenemos bases de datos de usuario, Job´s programados, inicios de sesión con contraseñas que desconocemos… Por lo que, propongo realizarlo de la forma:

 “(Antes de hacerlo en servidores de producción, intentar realizarlo en un servidor de pruebas.)”

 Los pasos son:

1. Haz un backup de la msdb.

2. Extrae todos los inicios de sesión de SQL con "sp_help_revlogin"

                http://support.microsoft.com/kb/246133

3. Haz un backup de las bases de datos de usuarios.

4. Desatacha las bases de datos de usuarios. (Deja solo la bases de datos del sistema)

http://msdn.microsoft.com/es-es/library/ms188031.aspx

5. Vuelve a generar la base de datos "master" especificando el nuevo collation en la propiedad SQLCOLLATION del comando setup (CD de instalación). Coloque los valores de INSTANCENAME, SAPWD y SQLCOLLATION segun necesites, Porejemplo:

Para SQL Server 2008:

 Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName

/SQLSYSADMINACCOUNTS=accounts /[ SAPWD= StrongPassword ]

/SQLCOLLATION=CollationName

Para SQL Server 2005:

start /wait setup.exe /qb INSTANCENAME=MSSQLSERVER REINSTALL=SQL_Engine

REBUILDDATABASE=1 SAPWD=test SQLCOLLATION=SQL_Latin1_General_CP1_CI_AI

6. Restaura la base de datos msdb:

Si la base de datos msdb contiene información de programación u otros datos que utiliza el sistema, es necesario restaurarla partir de una copia de seguridad cuando vuelva a generar la base de datos master, ya que la utilidad elimina y vuelve a crear la base de datos msdb

7. Recrea los inicios de sesión extraídos en el punto (2) con sp_help_revlogin

8. Atacha las bases de datos de usuario.

http://msdn.microsoft.com/es-es/library/ms179877.aspx

 

9. Verifica que los usuarios de base de datos, están enlazados con sus respectivos inicios de sesión. En caso de no estarlos:

sp_change_users_login 'update_one','UsuarioDeBBDD','InicioSesionSQL'

 

Intercalación (Collation) de una base de datos

El collation de una base de datos se puede obtener con la consulta:

 

SELECT CONVERT (varchar, DATABASEPROPERTYEX('database_name','collation'))

 

 Es posible cambiar la Intercalación de una base de datos utilizando el comando ALTER DATABASE COLLATE, esto no cambiará la intercalación de las tablas existentes, pero si lo hará en las tablas del sistema de la base de datos y en los nuevos objetos que se creen ya que explícitamente heredarán la Intercalación de la base de datos si no se les indica.

 

                ALTER DATABASE miBaseDatos COLLATE Modern_Spanish_CI_AS

 

 Si deseamos cambiar la Intercalación de una base de datos y de todos sus objetos, una solución es crear una nueva base de datos con la Intercalación deseada, generar el Script de creación de objetos de la base de datos original (sin especificar la Intercalación en dicho Script), ejecutar el Script en la nueva base de datos, donde todos los objetos irán heredando el collation de las base de datos, después tendremos que cargar los datos desde la base de datos original utilizando el Asistente de Importación de SQL Server o realizando las descargas y cargas de las tablas, con la utilidad BCP.EXE y/o con el comando BULK INSERT

 Intercalación (Collation) a nivel de tabla o campo.

 Es posible cambiar la Intercalación a nivel de tabla, e incluso se puede especificar collation diferentes para cada campo de una misma tabla. El comando a utiliza sería:

 

                ALTER TABLE ALTER COLUMN COLLATE Modern_Spanish_CI_AS

 

 Hay que tener en cuenta, que si queremos modificar la intercalación de campos tipo: índice, clave externa…, no nos dejará, produciéndose una salida de error. La idea sería eliminar los índice, clave externa… antes de modificar el collation y después volverlos a crear.

 

Indicar la Intercalación (Collation) de los campos en la propia consulta

 

 La convivencia de tablas con diferentes intercalaciones, dentro de una misma base de datos, pueden producir error si queremos cruzar datos entre sus campos con distinto collation. Una forma de realizar estas consultas entre tablas es usando sentencias tipo JOIN. Para evitar estos errores es posible indicar el collation dentro de las mismas consultas, como por ejemplo:

…WHERE a.campo1 = b.campo2 COLLATE Modern_Spanish_CI_AS

 Siempre podremos encontrarnos ante bases de datos, tablas, o incluso campos independientes,  con diferente intercalación (collatión) a la definida en el servidor (instancia de SQL), aunque yo prefiero intentar que sean las mismas.

 

  Los problemas de tener diferentes intercalaciones a la hora de comparar valores alfanuméricos, ya que dara error, nos obligará a forzar la intercalación  en las consultas, poniendo después de la columna la claúsula COLLATE seguido del nombre de intercalación a usar. Por ejemplo:

 

SELECT ...

FROM t1 INNER JOIN t2 ON t1.a COLLATE MODERN_SPANISH_CI_AS = t2. COLLATE

MODERN_SPANISH_CI_AS

 

 

 

Fuentes:

Microsoft, msdn, GuilleSQL

 

 

 

Apunte y recopilación por Norman M. Pardell

 

Puedes consultarme, si deseas cualquier aclaración, pregunta o sugerencia en: Contacto, contestaré tan pronto como me sea posible.

publicado por normanmpardell a las 19:36 · Sin comentarios  ·  Recomendar
Comentarios (0) ·  Enviar comentario
Esta entrada no admite comentarios.
img
.Sobre mí
FOTO

Norman M. Pardell

MCITP: Database Administrator & Database Developer, SQL Server 2008. MCC Award Certificate. Consultor Senior de bases de datos en Capgemini España, S.L. Asesoramiento en implementación, desarrollo y gestión de bases de datos en grandes compañías. Actualmente, asignado a proyecto en compañía líder en el sector energético global. Más de 10 años trabajando con SQL Server (y otros gestores de BBDD)

» Ver perfil

img
.Secciones
» Inicio
img
.Enlaces
» Microsoft MSDN Foros
» Windows Server 2012
img
.Más leídos
» Asignar la cantidad correcta de Memoria para SQL Server
» Base de Datos Sospechosa (Suspect)
» Como modificar la Intercalación (Collation) en SQL Server
» Como renombrar una instancia de SQL Server. sp_dropserver. sp_addserver
» Detectar bloqueos. SQL Server V.2005 y superiores
» Funciones SQL Server. Funciones escalares y funciones con valores de tabla.
» Integridad y corrupción en las bases de datos: DBCC CHECKDB
» Log de transacciones ( .ldf ). SQL Server.
» Migrando SQL Server 2005, 2008, 2008 R2 a SQL Server 2012
» Transacciones activas. SQL server 2008
img
.Nube de tags [?]
                                                           
img img
FULLServices Network | Crear blog | Privacidad