KB4054398 - 修复:“由于无排序规则导致比较无效”零售断言发生在 2014 年、2016 年和 2017 SQL Server

应用对象
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2014 Service Pack 2 - duplicate (do not use) SQL Server 2017 Standard on Windows SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2016 Service Pack 1 SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use)

症状

假设您有一个查询对 Microsoft SQL Server 2014、2016 和 2017 中的 CHAR 或 VARCHAR 列执行一些字符串操作,例如串联。 请考虑以下情形:

  • 将列与分配给它们的不同排序规则连接起来。
  • 这些排序规则彼此不兼容。 例如,尝试将整理为具有 Latin1_General_BIN Latin1_General_CI_AI的列连接起来。
  • 串联的最终结果分配给特定的排序规则 (,包括“database_default”) 作为排序规则冲突解决的问题。

在这种情况下,SQL Server 可能会返回指出“由于无排序规则而导致比较无效”的零售断言,并且你可能会收到一些类似以下内容的错误消息:

注意

  • 位置:typinfo.cpp:LineNumber
    表达式:false
    SPID: SPID
    Process ID: ProcessID
    说明:由于没有排序规则,比较无效。

  • 消息 3624,级别 20,状态 1,行 LineNumber
    系统断言检查失败。 查看 SQL Server 错误日志了解详细信息。 断言失败通常是由软件 bug 或数据损坏导致的。 若要检查数据库损坏,请考虑运行 DBCC CHECKDB。 如果你同意在安装过程中向 Microsoft 发送转储,则将向 Microsoft 发送一个小型转储。 更新可能来自 Microsoft 的最新服务包或技术支持的修补程序中提供。

  • 消息 596,级别 21,状态 1,行 LineNumber
    无法继续执行,因为会话处于终止状态。

  • 消息 0,级别 20,状态 0,行 行编号

  • 当前命令上发生严重错误。  如果有结果,应丢弃。

原因

在查询优化阶段,SQL Server 尝试计算查询各个阶段的中间结果的基数,例如串联。 由于排序规则冲突解决发生在最后,因此查询优化器可能没有意识到这一点,并尝试对具有冲突排序规则的输入执行串联基数的计算。

解决方法

此问题已在 SQL Server 的以下累积更新中修复:

SQL Server 2016 SP1 累积更新 8

SQL Server 2017 累积更新 4

SQL Server 2014 SP2 累积更新 9

关于 SQL Server 的累积更新:

SQL Server 的每个新累积更新都包含上一个累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:

SQL Server 2016 的最新累计更新

SQL Server 2017 的最新累计更新

SQL Server 2014 的最新累计更新

状态

Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。

参考资料

了解 Microsoft 用于描述软件更新的术语。