无法解决SELECT语句中第4列的排序规则冲突

时间:2011-02-17 08:23:50

标签: sql-server sql

我正在尝试执行一些SQL但收到以下错误

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

但似乎无法弄清楚问题出在哪里???非常感谢任何帮助。

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)

我的SQL技能非常基础,所以希望有人可以提供帮助

~~~~~~~~~~~~工作代码~~~~~~~~~~~~~

管理让它工作,这是代码

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)

4 个答案:

答案 0 :(得分:9)

排序规则基本上是一个代码页,告诉sql如何解释/比较/排序字符串。它可以是例如case(in)敏感或(不)忽略重音(如法语中的^)。更多信息,see here

在sql server中,您可以在服务器/数据库/列级别设置排序规则,其中每个较低级别可以覆盖较高级别的默认值。这使您可以比较两种不同排序规则的字符串。这就是捕获的地方。有时候不可能比较两种不同的排序规则。例如,如果第1列具有不区分大小写的排序规则而第2列具有区分大小写,并且您将第1列的“AAA”与第2列的“aaa”进行比较,它们是否相等?在这种情况下,sql会抛出排序规则错误。

column 4引用您的MemberData列,即巨型ISNULL(Case ...语句。 Sql排序规则冲突通常发生在字符串之间的比较中,这意味着您的一个IN或=运算符是罪魁祸首。为了调试,我会逐渐删除该语句的一部分,直到错误不再发生。然后检查刚刚删除的部分中列的排序规则。如果它们不同,很可能是你的问题。

然后,您可以使用COLLATE强制将其中一列的字符串强制转换为另一列的排序规则。但请注意,根据您的校对,您可以得到奇怪的比较结果,即“”可以等于“a”。我会尝试确定列中的哪些字符串给出排序错误,以便您可以看到使用COLLATE会产生什么效果。

作为一般规则,我建议永远不要覆盖数据库的默认排序规则,以防止出现这种麻烦。

答案 1 :(得分:2)

对于第四列,我怀疑'='的任何一侧是不同的排序规则。您可以尝试在'='的任一侧放置'collat​​e database_default'。 如果在第四列使用的每个表名上尝试“SP_HELP”,这将帮助您查看列级别的排序规则是否存在任何差异。 这不是问题的数据类型,而是列的整理类型。 正如SemVanmeenen上面所说,对于影响第4列的查询,尝试删除语句的某些部分并尝试运行它,然后再将它们放入。这可能有助于您识别有问题的代码行。 祝好运!请告诉我们您的情况。 问候, Jen Stirrup www.jenstirrup.com

答案 2 :(得分:0)

您的表中是否有“整理”列?

如果为true,则应在其名称后添加“collat​​e”。 作为示例,如果cmsPropertyType.contentTypeId是整理列。 代替 : ON MEMBTYPES.contentTypeId = MEMBLST.contentType

你应该写: ON MEMBTYPES.contentTypeId整理'contentTypeIdCollat​​eAlias'= MEMBLST.contentType

查看文档:{​​{3}}

阅读SemVanmeen的帖子,以便更好地了解您的问题

答案 3 :(得分:0)

两名嫌犯。

首先是:

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

value是什么类型的?它应该是nvarchar,否则你应该相应地转换它。

第二个是''中的默认ISNULL。也许您应该将其定义为N''

另外,关于子选择,为什么必须在WHEN中重复两次,然后在THEN中重复?您可以使用CASE完全替换该子COALESCE((SELECT value...), CONVERT(NVARCHAR, MEMBDATA.[dataInt]))