我正在尝试执行一些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)
答案 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)
对于第四列,我怀疑'='的任何一侧是不同的排序规则。您可以尝试在'='的任一侧放置'collate database_default'。 如果在第四列使用的每个表名上尝试“SP_HELP”,这将帮助您查看列级别的排序规则是否存在任何差异。 这不是问题的数据类型,而是列的整理类型。 正如SemVanmeenen上面所说,对于影响第4列的查询,尝试删除语句的某些部分并尝试运行它,然后再将它们放入。这可能有助于您识别有问题的代码行。 祝好运!请告诉我们您的情况。 问候, Jen Stirrup www.jenstirrup.com
答案 2 :(得分:0)
您的表中是否有“整理”列?
如果为true,则应在其名称后添加“collate”。 作为示例,如果cmsPropertyType.contentTypeId是整理列。 代替 : ON MEMBTYPES.contentTypeId = MEMBLST.contentType
你应该写: ON MEMBTYPES.contentTypeId整理'contentTypeIdCollateAlias'= 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]))
。