No puede resolver el conflicto de cotejo entre


He movido una de nuestras bases de datos (DB1) de SQL Server 2008 a 2012 y cuando corro los procedimientos almacenados obtengo el siguiente error

No puede resolver el conflicto de intercalación entre "SQL_Latin1_General_CP1_CI_AS" y "Latin1_General_CI_AS" en la operación igual a

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 todavía recibo 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 (GE's ihistorian) y tiene un desajuste de cotejo. ¿Hay alguna manera de resolver esto.

En el antiguo servidor DB1 se estableció como Latin1_General_CI_AS y esto funciona bien. La nueva ubicación de la BD tiene un valor predeterminado de SQL_Latin1_General_CP1_CI_AS. ¿Vale la pena cambiar la intercalación n DB1 en el nuevo servidor a Latin1_General_CI_AS??

Author: Nenad Zivkovic, 2013-07-12

1 answers

Lo que pasa con las colaciones es que aunque la base de datos tiene su propia colación, cada tabla y cada columna pueden tener su propia colación. Si no se especifica, toma el valor predeterminado de su objeto padre, pero puede ser diferente.

Cuando cambie la intercalación de la base de datos, será nueva por defecto para todas las tablas y columnas nuevas, pero no cambia la intercalación de 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 el cotejo de todos los campos en la base de datos sobre la marcha

Http://www.sqlservercentral.com/Forums/Topic820675-146-1.aspx

Si necesita tener una comparación diferente en dos objetos o no puede cambiar las intercalaciones-todavía puede JOIN entre ellos usando el comando COLLATE y eligiendo la intercalación que desea para unirse.

SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE Latin1_General_CI_AS 

O usando la intercalación de base de datos predeterminada:

SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE DATABASE_DEFAULT
 77
Author: Nenad Zivkovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:41