Ne peut résoudre le conflit de collation entre

j'ai déplacé une de nos bases de données (DB1) de SQL Server 2008 à 2012 et quand j'exécute les procédures stockées je reçois l'erreur suivante

ne peut pas résoudre le conflit de collation entre "SQL_Latin1_General_CP1_CI_AS" et "Latin1_General_CI_AS" dans l'équivalent de l'opération

j'ai changé la collation sur la base de données en utilisant

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

mais j'obtiens toujours l'erreur chaque fois que le stock exécuter les procédures. Je crois que parce que le SP utilise une jointure à une autre base de données (ihistorian de GE) et il a une inadéquation de collation. EST-il de toute façon de résoudre ce problème.

sur L'ancien serveur DB1 a été défini comme Latin1_General_CI_AS et cela fonctionne très bien. Le nouvel emplacement pour le DB a un défaut de SQL_Latin1_General_CP1_CI_AS . Est-ce que cela vaut la peine de changer la collation n DB1 sur le nouveau serveur en Latin1_General_CI_AS ??

35
demandé sur Nenad Zivkovic 2013-07-12 17:57:28

1 réponses

le truc avec les collations, c'est que même si la base de données a sa propre collation, chaque table, et chaque colonne peut avoir sa propre collation. Si elle n'est pas spécifiée, elle prend la valeur par défaut de son objet parent, mais peut être différente.

lorsque vous changez la collation de la base de données, ce sera une nouvelle valeur par défaut pour toutes les nouvelles tables et colonnes, mais cela ne change pas la collation des objets existants à l'intérieur de la base de données. Vous devez aller et changer manuellement le classement de chaque table et colonne.

Heureusement, il y a des scripts disponibles sur internet qui peuvent faire le travail. Je ne vais pas en recommander car je ne les ai pas essayés mais voici quelques liens:

http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of-all-Database

mettre à Jour le Classement de tous les champs dans la base de données à la volée

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

si vous avez besoin d'avoir une collation différente sur deux objets ou ne pouvez pas changer les collations - vous pouvez toujours JOIN entre eux en utilisant la commande COLLATE , et en choisissant la collation que vous voulez pour joindre.

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

ou par défaut à l'aide de classement de base de données:

SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE DATABASE_DEFAULT
77
répondu Nenad Zivkovic 2017-05-23 12:34:41