sql - intercalación - no se puede resolver el conflicto de intercalacion entre modern
No se puede resolver el conflicto de intercalación entre (1)
He movido una de nuestras bases de datos (DB1) de SQL Server 2008 a 2012 y cuando ejecuto los procedimientos almacenados obtengo el siguiente error
No se puede resolver el conflicto de intercalación entre "SQL_Latin1_General_CP1_CI_AS" y "Latin1_General_CI_AS" en la operación igual
Cambié la intercalación en la base de datos usando
ALTER DATABASE [optimiser] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [optimiser] COLLATE SQL_Latin1_General_CP1_CI_AS
ALTER DATABASE [optimiser] SET MULTI_USER
Pero sigo recibiendo el error cada vez que se ejecutan los procedimientos almacenados. Creo que porque el SP está usando una unión a otra base de datos (ihistorian de GE) y tiene una discrepancia de colación. Hay alguna manera de resolver esto.
En el servidor anterior, DB1 se configuró como Latin1_General_CI_AS
y esto funciona bien. La nueva ubicación para la base de datos tiene un valor predeterminado de SQL_Latin1_General_CP1_CI_AS
. ¿Vale la pena cambiar la recopilación n DB1 en el nuevo servidor a Latin1_General_CI_AS
?
Lo que ocurre con las intercalaciones es que, aunque la base de datos tiene su propia intercalación, cada tabla y cada columna pueden tener su propia intercalación. Si no se especifica, toma el valor predeterminado de su objeto principal, pero puede ser diferente.
Cuando cambie la intercalación de la base de datos, será un nuevo valor predeterminado para todas las tablas y columnas nuevas, pero no cambia la intercalación de los objetos existentes dentro de la base de datos. Tienes que ir y cambiar manualmente la intercalación de cada tabla y columna.
Afortunadamente, hay scripts disponibles en Internet que pueden hacer el trabajo. No voy a recomendar ninguno ya que no los he probado, pero aquí hay algunos enlaces:
http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of-all-Database
Actualizar la compilación de todos los campos en la base de datos sobre la marcha
http://www.sqlservercentral.com/Forums/Topic820675-146-1.aspx
Si necesita una intercalación diferente en dos objetos o no puede cambiar las intercalaciones, puede JOIN
entre ellos utilizando el comando COLLATE
y eligiendo la intercalación que desea para la unión.
SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE Latin1_General_CI_AS
o usando la recopilación de bases de datos por defecto:
SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE DATABASE_DEFAULT