sql_latin1_general_cp1_ci_as puede modern intercalación intercalacion entre conflicto sql sql-server sql-server-2008 sql-server-2012 collation

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