当前位置: 首页 > 面试题库 >

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

鲜于渊
2023-03-14
问题内容

我正在尝试执行一些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会引发排序规则错误。

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

然后,您可以使用COLLATE强制将其中一列的字符串强制转换为另一列的排序规则。但是请注意,根据您的排序规则,您可以获得奇怪的比较结果,即“脗”可以等于“
a”,也可以等于“ a”。我会尝试确定列中哪些字符串给出了排序规则错误,以便您可以看到使用COLLATE会带来的影响。

通常,我建议不要为避免此类麻烦而覆盖数据库的默认排序规则。



 类似资料:
  • 问题内容: 我有两个查询: 首先不起作用: 因为我得到错误: 第二部作品: 结构: 问题答案: 在两个表上使用。Hotels.TargetCode上的排序规则与on上的排序规则不同,因此DB不知道如何处理结果。 您可以强制其中一个排序规则与另一个排序规则匹配,或者将结果放入已定义排序规则的预定义临时表中。 编辑: 您可以使用类似…的方法来覆盖现有的排序规则。 …在查询中。这将使用带有collat​

  • 问题内容: 在我们的开发人员和生产SQL Server之间,数据库,表和某些列的排序规则存在差异,这对开发造成了严重破坏。事情将在dev上运行,然后在升级时由于归类冲突而中断,数据和结构将从prod复制到dev,这又由于冲突而中断对dev的查询,等等。我们将通过明确定义有时会在查询中使用COLLATION选项,或者在有问题的表中设置每一列的排序规则来解决该问题。前者似乎在性能上受到打击,而后者是P

  • 我的语法允许以下操作: 我从其他语法中抓了几个东西来玩。我的主要问题是我的expr规则。给定以下输入:,我期望解析树会找到..规则,但它将解释0。并不正确解析其余部分。 如果在我的0后面加上一个空格,就可以了: 谢了!

  • 问题内容: 我在SQL Server 2005中收到以下错误消息 消息120,级别15,状态1,过程usp_AttributeActivitiesForDateRange,行18。INSERT语句的选择列表包含的项目少于插入列表。SELECT值的数量必须与INSERT列的数量匹配。 我已经复制并粘贴了选择列表,然后将列表插入到excel中,并验证了每个列表中有相同数量的项目。这两个表的附加主键字段

  • 问题内容: 我正在从具有整数id值的大型表(数百万行)中选择一组帐户记录。从某种意义上说,查询是最基本的。我正在做的是建立一个大型的逗号分隔列表,并将其作为“ in”子句传递到查询中。现在,结果是完全无序的。我想做的是按“ in”子句中的值顺序返回结果。 我想我将不得不建立一个临时表并进行联接,这是我想避免的,但可能无法做到。 有什么想法吗?现在,由于我们正试图限制输出大小,每个查询的大小上限为6

  • 因此,我正在使用AntlrWorks2.1在ANTLR4中研究一个组合语法。我有lexer规则和,它们不被识别为已定义的lexer规则,但仅在最后定义的解析器规则中。在这些规则后面添加一个文字将删除(或隐藏)这些错误。 我的语法末尾有错误(斜体标记抛出错误):