J'ai le code suivant
SELECT tA.FieldName As [Field Name],
COALESCE(tO_A.[desc], tO_B.[desc], tO_C.Name, tA.OldVAlue) AS [Old Value],
COALESCE(tN_A.[desc], tN_B.[desc], tN_C.Name, tA.NewValue) AS [New Value],
U.UserName AS [User Name],
CONVERT(varchar, tA.ChangeDate) AS [Change Date]
FROM D tA
JOIN
[DRTS].[dbo].[User] U
ON tA.UserID = U.UserID
LEFT JOIN
A tO_A
on tA.FieldName = 'AID'
AND tA.oldValue = CONVERT(VARCHAR, tO_A.ID)
LEFT JOIN
A tN_A
on tA.FieldName = 'AID'
AND tA.newValue = CONVERT(VARCHAR, tN_A.ID)
LEFT JOIN
B tO_B
on tA.FieldName = 'BID'
AND tA.oldValue = CONVERT(VARCHAR, tO_B.ID)
LEFT JOIN
B tN_B
on tA.FieldName = 'BID'
AND tA.newValue = CONVERT(VARCHAR, tN_B.ID)
LEFT JOIN
C tO_C
on tA.FieldName = 'CID'
AND tA.oldValue = tO_C.Name
LEFT JOIN
C tN_C
on tA.FieldName = 'CID'
AND tA.newValue = tN_C.Name
WHERE U.Fullname = @SearchTerm
ORDER BY tA.ChangeDate
Lors de l'exécution du code, je reçois l'erreur collée dans le titre après avoir ajouté les deux jointures pour le tableau C.Je pense que cela peut avoir quelque chose à voir avec le fait que j'utilise SQL Server 2008 et que j'ai restauré une copie de cette base de données sur ma machine qui est 2005.
la source
Je fais ce qui suit:
Fonctionne à chaque fois. :)
la source
Utilisez la
collate
clause dans votre requête:Je n'ai peut-être pas la syntaxe exacte (vérifiez BOL), mais vous pouvez le faire pour modifier le classement à la volée pour la requête - vous devrez peut-être ajouter la clause pour chaque jointure.
edit: J'ai réalisé que ce n'était pas tout à fait correct - la clause collate va après le champ que vous devez changer - dans cet exemple, j'ai changé le classement sur le
tA.oldValue
champ.la source
Identifiez les champs pour lesquels il génère cette erreur et ajoutez-leur ce qui suit: COLLATE DATABASE_DEFAULT
Il y a deux tables jointes sur le champ Code:
Mettez à jour votre requête pour:
la source
Cela peut facilement se produire lorsque vous avez 2 bases de données différentes et spécialement 2 bases de données différentes de 2 serveurs différents. La meilleure option est de la changer en une collection commune et de faire la jointure ou la comparaison.
la source
@Valkyrie réponse géniale. Je pensais que je mettais ici un cas lors de l'exécution de la même chose avec une sous-requête à l'intérieur d'une procédure stockée, car je me demandais si votre réponse fonctionnait dans ce cas, et c'était génial.
la source
Dans où les critères s'ajoutent
collate SQL_Latin1_General_CP1_CI_AS
Cela fonctionne pour moi.
la source
La cause principale est que la base de données du serveur SQL à partir de laquelle vous avez pris le schéma a un classement qui diffère de votre installation locale. Si vous ne voulez pas vous soucier du classement, réinstallez SQL Server localement en utilisant le même classement que la base de données SQL Server 2008.
la source
erreur (ne peut pas résoudre le conflit de classement entre ....) se produit généralement lors de la comparaison des données de plusieurs bases de données.
puisque vous ne pouvez pas modifier le classement des bases de données maintenant, utilisez COLLATE DATABASE_DEFAULT.
la source
J'ai déjà eu quelque chose comme ça auparavant, et ce que nous avons constaté, c'est que le classement entre 2 tables était différent.
Vérifiez que ce sont les mêmes.
la source
Grâce à la réponse de marc_s, j'ai résolu mon problème d'origine - inspiré pour aller plus loin et publier une approche pour transformer une table entière à la fois - script tsql pour générer les instructions alter column:
obtient: ALTER TABLE Affilié ALTER COLUMN myTable NVARCHAR (4000) COLLATE Latin1_General_CI_AS NOT NULL
J'avoue être perplexe devant la nécessité de col.max_length / 2 -
la source
Pour ceux qui ont un script CREATE DATABASE (comme c'était mon cas) pour la base de données à l'origine de ce problème, vous pouvez utiliser le script CREATE suivant pour faire correspondre le classement:
ou
Cela applique le classement souhaité à toutes les tables, ce qui était exactement ce dont j'avais besoin. Il est idéal d'essayer de conserver le même classement pour toutes les bases de données sur un serveur. J'espère que cela t'aides.
Plus d'informations sur le lien suivant: SQL SERVER - Création d'une base de données avec un classement différent sur le serveur
la source
J'ai utilisé le contenu de ce site pour créer le script suivant qui modifie le classement de toutes les colonnes dans toutes les tables:
la source
Vérifiez le niveau de classement qui ne correspond pas (serveur, base de données, table, colonne, caractère).
S'il s'agit du serveur, ces étapes m'ont aidé une fois:
Exécutez cette commande:
sqlservr -m -T4022 -T3659 -s"name_of_insance" -q "name_of_collation"
Démarrez votre serveur SQL:
net start name_of_instance
Vérifiez à nouveau le classement de votre serveur.
Voici plus d'informations:
https://www.mssqltips.com/sqlservertip/3519/changing-sql-server-collation-after-installation/
la source
Si cela se produit sur l'ensemble de votre base de données, il est préférable de modifier votre classement de base de données comme suit:
Référence ici
la source
Ajout de code à la réponse de @ JustSteve pour gérer les colonnes varchar et varchar (MAX):
la source
Pour résoudre ce problème dans la requête sans modifier l'une des bases de données, vous pouvez convertir les expressions de l'autre côté du signe "=" avec
comme suggéré ici .
la source
J'ai eu une erreur similaire (Impossible de résoudre le conflit de classement entre "SQL_Latin1_General_CP1_CI_AS" et "SQL_Latin1_General_CP1250_CI_AS" dans l'opération INTERSECT), lorsque j'ai utilisé l'ancien pilote jdbc.
J'ai résolu ce problème en téléchargeant un nouveau pilote à partir de Microsoft ou du projet open-source jTDS .
la source
voici ce que nous avons fait, dans notre situation, nous avons besoin d'une requête ad hoc à exécuter en utilisant une restriction de date sur demande, et la requête est définie dans un tableau.
Notre nouvelle requête doit faire correspondre les données entre différentes bases de données et inclure les données des deux.
Il semble que la COLLATION soit différente entre la base de données qui importe les données du système iSeries / AS400 et notre base de données de rapports - cela pourrait être dû aux types de données spécifiques (tels que les accents grecs sur les noms, etc.).
Nous avons donc utilisé la clause de jointure ci-dessous:
la source
Vous pouvez facilement le faire en utilisant 4 étapes faciles
la source
la source
Vous ne pouvez avoir aucun problème de classement dans votre base de données, mais si vous avez restauré une copie de votre base de données à partir d'une sauvegarde sur un serveur avec un classement différent de l'origine, et que votre code crée des tables temporaires, ces tables temporaires hériteraient du classement de le serveur et il y aurait des conflits avec votre base de données.
la source
la source
J'avais une exigence similaire; documenter mon approche ici pour toute personne ayant un scénario similaire ...
Scénario
Solution
Utilisez la comparaison de schémas SQL Server (à partir de SQL Server Data Tools / Visual Studio) pour comparer la source (installation propre) avec la destination (la base de données avec un classement non valide).
Dans mon cas, j'ai comparé les deux DB directement; bien que vous puissiez travailler via un projet pour vous permettre de modifier manuellement les pièces entre les deux ...
Object Types
sélectionnez uniquement les types qui vous intéressent (pour moi, c'était seulementViews
etTables
)General
sélectionner:DELETE
dossier et en le sélectionnantEXCLUDE
.CREATE
objets (ici, car ils n'existent pas dans la cible, ils ne peuvent pas y avoir le mauvais classement; s'ils doivent exister est une question pour un autre sujet).Update
pour pousser les changementsCela implique toujours un effort manuel (par exemple, vérifier que vous n'affectez que le classement) - mais il gère les dépendances pour vous.
Vous pouvez également conserver un projet de base de données du schéma valide afin que vous puissiez utiliser un modèle universel pour vos bases de données si vous avez plus de 1 à mettre à jour, en supposant que toutes les bases de données cibles doivent se retrouver avec le même schéma.
Vous pouvez également utiliser la fonction de recherche / remplacement sur les fichiers d'un projet de base de données si vous souhaitez y modifier en masse les paramètres (par exemple, pour pouvoir créer le projet à partir de la base de données non valide à l'aide de la comparaison de schémas, modifier les fichiers du projet, puis basculer la source / cible dans comparer le schéma pour renvoyer vos modifications à la base de données).
la source