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
??
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