Impossible de résoudre le conflit de classment pour la colonne 4 dans l'instruction SELECT

J'essaye d'get du SQL à exécuter mais j'obtiens l'erreur suivante

Msg 451, Level 16, State 1, Line 1 Cannot resolve collation conflict for column 4 in SELECT statement. 

Mais ne peut pas sembler comprendre où le problème est ??? Toute aide sera la bienvenue.

 SELECT MEMBTYPEID.text AS MemberType, MEMBLST.nodeId, MEMBTYPES.Name AS MemberField, ISNULL(CASE WHEN MEMBTYPES.datatypeID IN (SELECT NodeId FROM DBO.CMSDATATYPE WHERE DBTYPE = 'Nvarchar') THEN MEMBDATA.[dataNvarchar] WHEN MEMBTYPES.datatypeID IN (SELECT NodeId FROM DBO.CMSDATATYPE WHERE DBTYPE = 'Ntext') THEN MEMBDATA.[dataNtext] WHEN MEMBTYPES.datatypeID IN (SELECT NodeId FROM DBO.CMSDATATYPE WHERE DBTYPE = 'Date') THEN CONVERT(NVARCHAR, MEMBDATA.[dataDate]) WHEN MEMBTYPES.datatypeID IN (SELECT NodeId FROM DBO.CMSDATATYPE WHERE DBTYPE = 'Integer') THEN CASE WHEN (SELECT value FROM [dbo].[cmsDataTypePreValues] WHERE datatypenodeid = MEMBTYPES.[dataTypeId] AND id = CONVERT(INT, MEMBDATA.[dataInt])) IS NOT NULL THEN (SELECT value FROM [dbo].[cmsDataTypePreValues] WHERE datatypenodeid = MEMBTYPES.[dataTypeId] AND id = CONVERT(INT, MEMBDATA.[dataInt])) ELSE CONVERT(NVARCHAR, MEMBDATA.[dataInt]) END ELSE NULL END, '') AS MemberData FROM (SELECT id, text FROM dbo.umbracoNode WHERE (nodeObjectType = '9b5416fb-e72f-45a9-a07b-5a9a2709ce43')) AS MEMBTYPEID LEFT OUTER JOIN (SELECT nodeId, contentType FROM dbo.cmsContent) AS MEMBLST ON MEMBLST.contentType = MEMBTYPEID.id LEFT OUTER JOIN dbo.cmsPropertyType AS MEMBTYPES ON MEMBTYPES.contentTypeId = MEMBLST.contentType LEFT OUTER JOIN dbo.cmsPropertyData AS MEMBDATA ON MEMBDATA.contentNodeId = MEMBLST.nodeId AND MEMBDATA.propertytypeid = MEMBTYPES.id LEFT OUTER JOIN dbo.cmsMember AS MEMB ON MEMB.nodeId = MEMBLST.nodeId WHERE (MEMBLST.nodeId IS NOT NULL) 

Mes compétences SQL sont assez basiques, alors j'espère que quelqu'un pourra m'aider

~~~~~~~~~~~~ CODE DE TRAVAIL ~~~~~~~~~~~~~

Géré pour le faire fonctionner et voici le code

 SELECT MEMBTYPEID.text AS MemberType, MEMBLST.nodeId, MEMBTYPES.Name AS MemberField, MEMBTYPES.Alias AS MemberFieldAlias, MEMB.LoginName, ISNULL(CASE WHEN MEMBTYPES.datatypeID IN (SELECT NodeId FROM DBO.CMSDATATYPE WHERE DBTYPE = 'Nvarchar') THEN MEMBDATA.[dataNvarchar] WHEN MEMBTYPES.datatypeID IN (SELECT NodeId FROM DBO.CMSDATATYPE WHERE DBTYPE = 'Ntext') THEN MEMBDATA.[dataNtext] WHEN MEMBTYPES.datatypeID IN (SELECT NodeId FROM DBO.CMSDATATYPE WHERE DBTYPE = 'Date') THEN CONVERT(NVARCHAR, MEMBDATA.[dataDate]) WHEN MEMBTYPES.datatypeID IN (SELECT NodeId FROM DBO.CMSDATATYPE WHERE DBTYPE = 'Integer') THEN CONVERT(NVARCHAR, MEMBDATA.[dataInt]) ELSE NULL END, NULL) AS MemberData FROM (SELECT id, text FROM dbo.umbracoNode WHERE (nodeObjectType = '9b5416fb-e72f-45a9-a07b-5a9a2709ce43')) AS MEMBTYPEID LEFT OUTER JOIN (SELECT nodeId, contentType FROM dbo.cmsContent) AS MEMBLST ON MEMBLST.contentType = MEMBTYPEID.id LEFT OUTER JOIN dbo.cmsPropertyType AS MEMBTYPES ON MEMBTYPES.contentTypeId = MEMBLST.contentType LEFT OUTER JOIN dbo.cmsPropertyData AS MEMBDATA ON MEMBDATA.contentNodeId = MEMBLST.nodeId AND MEMBDATA.propertytypeid = MEMBTYPES.id LEFT OUTER JOIN dbo.cmsMember AS MEMB ON MEMB.nodeId = MEMBLST.nodeId WHERE (MEMBLST.nodeId IS NOT NULL) 

Un classment est essentiellement une page de codes qui indique à sql comment interpréter / comparer / sortinger les strings. Il peut s'agir par exemple de casse (in) sensible ou (pas) d'ignorer les accents (comme ^ en français). Pour plus d'informations, voir ici .

Dans le server sql, vous définissez le classment sur le niveau server / database / colonne où chaque niveau inférieur peut replace le niveau par défaut du niveau supérieur. Cela vous permet de comparer des strings de deux classments différents. Et c'est là que la capture. Parfois, il est impossible de comparer 2 classments différents. Par exemple, si la colonne 1 a un classment insensible à la casse et la colonne 2 est sensible à la casse et que vous comparez «AAA» de la colonne 1 avec «aaa» de la colonne 2, sont-ils égaux ou non? Dans ce cas, sql génère une erreur de classment.

column 4 fait reference à votre colonne MemberData, c'est-à-dire l' ISNULL(Case ... conflits de classment Sql se produisent généralement avec des comparaisons entre les strings, ce qui signifie que l'un de vos opérateurs IN ou = est le coupable. cette instruction jusqu'à ce que l'erreur ne se produise plus.Vérifiez ensuite le classment des colonnes dans la partie que vous venez de supprimer.S'ils sont différents, il est très probable que c'est votre problème.

Vous pouvez ensuite utiliser COLLATE pour forcer la string de l'une de ces colonnes à effectuer le classment de l'autre colonne. Soyez averti cependant qu'en fonction de votre collation vous pouvez get des résultats de comparaison étranges, c'est-à-dire que 'Â' peut être égal à 'a' ou non. Je voudrais essayer de déterminer quelles strings dans vos colonnes donnent l'erreur de classment afin que vous puissiez voir quel serait l'effet de l'utilisation de COLLATE.

En règle générale, je recommand de ne jamais replace le classment par défaut de votre database juste pour éviter ce genre de maux de tête.

Pour la quasortingème colonne, je soupçonne que quelque chose de chaque côté du '=' est une collation différente. Vous pouvez essayer de mettre 'collate database_default' de chaque côté du '='. Si vous essayez 'SP_HELP' sur chacun des noms de tables utilisés par la quasortingème colonne, cela vous aidera à voir s'il y a des différences dans le classment au niveau de la colonne. Ce n'est pas le type de données qui pose problème, c'est le type de collation de la colonne. Comme SemVanmeenen l'a dit plus haut, pour la requête affectant la 4ème colonne, essayez de supprimer certaines parties de l'instruction et essayez de l'exécuter, puis remettez-les à nouveau. Cela pourrait vous aider à identifier la ligne de code incriminée. Bonne chance! S'il vous plaît, faites-nous savoir comment vous allez. Cordialement, Jen Stirrup http://www.jenstirrup.com

Avez-vous des colonnes "d'assemblage" dans vos arrays?

Si c'est vrai, vous devriez append "collationner" après leurs noms. Par exemple si cmsPropertyType.contentTypeId est une colonne d'assemblage. Au lieu de: ON MEMBTYPES.contentTypeId = MEMBLST.contentType

Vous devez écrire: ON MEMBTYPES.contentTypeId assembler 'contentTypeIdCollateAlias' = MEMBLST.contentType

Consultez la documentation: Doc on MSDN

Et lisez le post de SemVanmeen pour une meilleure compréhension de votre problème

Deux suspects.

Le premier est celui-ci:

 SELECT value FROM [dbo].[cmsDataTypePreValues] WHERE datatypenodeid = MEMBTYPES.[dataTypeId] AND id = CONVERT(INT, MEMBDATA.[dataInt]) 

Quel type est la value ? Il devrait probablement être nvarchar , sinon vous devriez le convertir en conséquence.

La seconde est la valeur par défaut dans l' ISNULL . Peut-être que vous devriez le définir comme N'' ?

Aussi, en ce qui concerne la sous-sélection, pourquoi doit-elle être répétée deux fois, en WHEN , et ensuite en THEN ? Vous pouvez replace complètement ce sous- CASE par COALESCE((SELECT value...), CONVERT(NVARCHAR, MEMBDATA.[dataInt])) .