web-dev-qa-db-fra.com

Impossible de résoudre le conflit de classement

J'ai déplacé l'une de nos bases de données (DB1) de SQL Server 2008 à 2012 et lorsque j'exécute les procédures stockées, l'erreur suivante s'affiche

Impossible de résoudre le conflit de classement entre "SQL_Latin1_General_CP1_CI_AS" et "Latin1_General_CI_AS" dans l'opération égal à

J'ai changé le classement 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 je reçois toujours l'erreur à chaque exécution des procédures stockées. Je pense que parce que SP utilise une jointure vers une autre base de données (ihistorian de GE)) et qu'il comporte une incompatibilité de classement. IS existe quand même pour résoudre ce problème.

Sur l'ancien serveur, DB1 était défini sur Latin1_General_CI_AS et cela fonctionne bien. Le nouvel emplacement de la base de données a une valeur par défaut de SQL_Latin1_General_CP1_CI_AS. Est-il utile de remplacer le classement n DB1 sur le nouveau serveur par Latin1_General_CI_AS ??

41
Silentbob

Le problème avec les classements est que, même si la base de données a son propre classement, chaque table et chaque colonne peut avoir son propre classement. S'il n'est pas spécifié, il prend la valeur par défaut de son objet parent, mais peut être différent.

Lorsque vous modifiez le classement de la base de données, ce sera la nouvelle valeur par défaut pour toutes les nouvelles tables et colonnes, mais cela ne modifiera pas le classement des objets existants dans la base de données. Vous devez modifier manuellement le classement de chaque table et colonne.

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

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

Mise à jour du classement de tous les champs de la base de données à la volée

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

Si vous devez disposer de classements différents sur deux objets ou si vous ne pouvez pas modifier les classements, vous pouvez toujours JOIN utiliser la commande COLLATE et choisir le classement que vous souhaitez associer.

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

ou en utilisant le classement par défaut de la base de données:

SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE DATABASE_DEFAULT
85
Nenad Zivkovic