Como cambiar el Collation (Intercalación) en una Base de Datos de SQL SERVER
Algunas veces requerimos cambiar el Collation en una Base de Datos con el que se dio de altauna base de datos, por lo regular esto es necesario cuando nuestro servidor de base de
datos tiene establecido un collation y nuestra base de datos fue dada de alta con otro
collation distinto.
Por Ejemplo: Mi servidor tiene el collation SQL_Latin1_General_CP1_CI_AI
y una base de datos se dio de alta con el collation: Modern_Spaish_CI_AS
El primer collation significa que el servidor el Collation está configurado:
CI (Case Insensitive ó Insensible a Mayúsculas y Minúsculas) AI (Accent Insensitive ó Insensible a Asentos)
y la base de datos fue configurada como:
CI (Case Insensitive) AS (Accent Sensitive ó Sensible a Acentos)
Esto provoca que al realizar alguna búsqueda, por ejemplo de algún nombre que contenga
un asento en una letra el SQL nos va mandar un error de Collation similar al siguiente:
Para cambiar el Collation de una base de datos sigamos las siguientes instrucciones
-- Nos cambiamos a la Base de Datos Master con credenciales del usuario SA
USE master;
-- Con este query checamos el collation (intercalación) que tiene actualmente nuestra BD
SELECT name, collation_name
FROM sys.databases
WHERE name = N'MI_BASE_DE_DATOS'
-- Antes de Aplicar el Alter a la Base de Datos tendremos que poner la BD en modo single_user, es decir que los demás usuarios serán desconectados por un momento. (Avise a los usuarios)
ALTER DATABASE MI_BASE_DE_DATOS SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
-- Aplicamos un alter database con el nombre de la base de datos y el collation (intercalación) que queremos establecer
ALTER DATABASE MI_BASE_DE_DATOS COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI
-- Regresamos el modo de acceso de la base de datos a Multi Usuario
ALTER DATABASE MI_BASE_DE_DATOS SET MULTI_USER;
-- Volvemos a verificar el Collation de la BD:
SELECT name, collation_name
FROM sys.databases
WHERE name = N'MI_BASE_DE_DATOS'
En mi caso me presentó un error posterior debido a un objeto que marcaba como que tenía dependencias y que debido a ello no se podía hacer el alter de la base de datos.
The object 'FuncionMesesaDias' is dependent on database collation.
The database collation cannot be changed if a schema-bound object depends on it.
Remove the dependencies on the database collation and
then retry the operation.
Como este objeto es una función, lo único que hice fue checar su estructura con la instrucción sp_helptext
sp_helptext FuncionMesesaDias copié la estructura en un bloc de notas.
después de esto eliminé la función con la funcion drop function
apliqué nuevamente las instrucciones para cambiar el collation de la Base de Datos y ya no marcó ningún error.
Después de cambiado el collation volví a crear la función 'FuncionMesesaDias' con la estructura que había copiado previamente en el bloc de notas
Una vez cambiado el collation de nuestra base de datos puede ser que algunas tablas que tienen campos con el collation anterior también tengan que ser modificadas, para ello se puede usar la sentencia:
ALTER TABLE [dbo].[nombre_de_tabla]
ALTER COLUMN [nombredecampo] VARCHAR(3) COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI NULL
Quizá nos encontremos con algún error de que hay indices o llaves foraneas que dependen de este campo, si ese fuera el caso no queda otro remedio que eliminar los indices que hagan referencia al campo que queremos modificar.
DROP INDEX nombre_de_indice ON nombre_de_tabla
En caso de que no puedas modificar la estructura de las tablas para cambiar los collation lo que puedes hacer es utilizar la siguiente instrucción:
SELECT ID
FROM Mi_taba_1
INNER JOIN Mi_Tabla_2
WHERE Mi_tabla_1.Collation1Col COLLATE DATABASE_DEFAULT
= Mi_Tabla_2.Collation2Col COLLATE DATABASE_DEFAULT
FROM Mi_taba_1
INNER JOIN Mi_Tabla_2
WHERE Mi_tabla_1.Collation1Col COLLATE DATABASE_DEFAULT
= Mi_Tabla_2.Collation2Col COLLATE DATABASE_DEFAULT
¡Suerte!
Mis Mejores Saludos
Xavier García
No hay comentarios:
Publicar un comentario