【问题标题】:Cannot resolve the collation conflict between "SQL_AltDiction_CP850_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation无法解决等于操作中“SQL_AltDiction_CP850_CI_AS”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突
【发布时间】:2015-10-21 10:54:48
【问题描述】:

我的存储过程中有一段代码如下 -

update tblexpwitretrocmdocs set sCheckedOut = A.sEditor, idone = 0 
from #tblDocs A
JOIN tblexpwitretrocmdocs B ON A.SID = B.SID
where A.iDocumentTypeId in (16,17,13,11)
and A.sid not in (select SID COLLATE SQL_AltDiction_CP850_CI_AS from tblexpwitdocumentgeneral)

我收到错误“无法解决等于操作中“SQL_AltDiction_CP850_CI_AS”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突。”第一行代码。

表 - tblexpwitretrocmdocs 中的列 - sCheckedOut 具有排序规则 SQL_AltDiction_CP850_CI_AS。因此,为了使列 - sEditor 与其兼容,我将临时表定义如下 -

CREATE TABLE #tblDocs(
iId INT IDENTITY (1,1),
SID NVARCHAR(50) COLLATE SQL_AltDiction_CP850_CI_AS,
iDocumentTypeId INT,
sType NVARCHAR(200),
sEditor NVARCHAR(50) COLLATE SQL_AltDiction_CP850_CI_AS 
)

我仍然遇到同样的错误。请帮我解决这个问题。

【问题讨论】:

  • 排序规则冲突可能来自NOT IN 谓词。试试 - AND A.sid not in (select SID COLLATE SQL_AltDiction_CP850_CI_AS from tblexpwitdocumentgeneral)
  • 感谢 Gareth,这适用于给定的代码。但现在我不得不稍微更改更新查询,错误仍然存​​在。你能告诉我还有什么需要改变的吗?我已经更新了上面的代码。
  • 错误现在来自 JOIN 谓词 JOIN tblexpwitretrocmdocs B ON A.SID = B.SID ---- 再次尝试 --- JOIN tblexpwitretrocmdocs B ON A.SID = B.SID COLLATE SQL_AltDiction_CP850_CI_AS -- 如果您在 SSMS 中运行这些查询,然后双击错误消息它实际上会将您带到有问题的行,然后您只需要添加显式排序规则即可解决错误。
  • 谢谢加雷斯!现在工作正常。

标签: sql-server sql-server-2005


【解决方案1】:

要解决排序规则冲突,请在“=”运算符周围添加“COLLATE DATABASE_DEFAULT”关键字,如下所示:

UPDATE tblexpwitretrocmdocs SET sCheckedOut = A.sEditor, idone = 0 
FROM #tblDocs A
JOIN tblexpwitretrocmdocs B ON A.SID = B.SID
WHERE A.iDocumentTypeId in (16,17,13,11) COLLATE DATABASE_DEFAULT
AND A.sid COLLATE DATABASE_DEFAULT NOT IN 
(SELECT SID COLLATE DATABASE_DEFAULT FROM tblexpwitdocumentgeneral)

希望这会有所帮助...

【讨论】:

    【解决方案2】:

    为所有临时表字符串列的排序规则指定DATABASE_DEFAULT以使用当前数据库默认排序规则:

    CREATE TABLE #tblDocs(
        iId INT IDENTITY (1,1),
        SID NVARCHAR(50) COLLATE DATABASE_DEFAULT,
        iDocumentTypeId INT,
        sType NVARCHAR(200) COLLATE DATABASE_DEFAULT,
        sEditor NVARCHAR(50) COLLATE DATABASE_DEFAULT
    );
    

    对于与数据库默认排序规则不同的列,请指定确切的列排序规则而不是 DATABASE_DEFAULT

    【讨论】:

    • Dan,我已经尝试过了,但它不起作用。可能是因为默认排序规则是 SQL_Latin1_General_CP1_CI_AS 并且在这里它与 SQL_AltDiction_CP850_CI_AS 进行比较。谢谢!
    猜你喜欢
    • 2018-10-20
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多