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

Sql server 无法解决SELECT语句中第4列的排序规则冲突,sql-server,sql,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,

我正在尝试执行一些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)

排序规则基本上是一个代码页,它告诉sql如何解释/比较/排序字符串。例如,它可以区分大小写或忽略重音(如法语中的“^”)。如需更多信息

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

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

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

作为一般规则,我建议不要仅仅为了防止这种麻烦而覆盖数据库的默认排序规则。

表中是否有“collate”列

如果为true,则应在其名称后添加“collate”。 例如,如果cmsPropertyType.contentTypeId是一个collate列。 而不是: 在MEMBTYPES.contentTypeId=MEMBLST.contentType上

你应该写: 在MEMBTYPES.contentTypeId上,collate'contentTypeIdCollateAlias'=MEMBLST.contentType

查看文档:

阅读SemVanmeen的帖子,更好地了解你的问题,两个嫌疑犯

第一个是:

SELECT     value
FROM          [dbo].[cmsDataTypePreValues]
WHERE      datatypenodeid = MEMBTYPES.[dataTypeId] AND id = CONVERT(INT, MEMBDATA.[dataInt])
什么类型的
value
?它可能应该是
nvarchar
,否则您应该相应地转换它

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


另外,关于subselect,为什么它必须重复两次,在
WHEN
中,然后在
THEN
中?您可以用
合并((选择值…,转换(NVARCHAR,MEMBDATA.[dataInt])完全替换该sub-
大小写

对于第四列,我怀疑“=”两侧的内容是不同的排序规则。您可以尝试将“collate database\u default”放在“=”两侧。 如果您对第四列使用的每个表名尝试“SP_HELP”,这将帮助您查看列级别的排序规则是否有任何差异。 问题不在于数据类型,而在于列的排序规则类型。 正如SemVanmeenen在上面所说的,对于影响第4列的查询,请尝试删除语句的某些部分并尝试运行它,然后再次将它们放入。这可能有助于您识别有问题的代码行。 祝你好运!请告诉我们你进展如何。 当做 珍马镫
www.jenstropr.com

感谢所有人的帮助,我终于让它工作了,并编辑了上面的内容,添加了工作版本