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_CI_AI的列与Latin1_General_BIN连接。
  • 串联的最终结果分配给特定的排序规则 (包括“database_default”) 作为排序规则冲突解决事项。

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

注意

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

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

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

  • 消息 0,级别 20,状态 0,LineNumber

  • 当前命令出现严重错误。  应放弃结果(如果有)。

原因

在查询优化阶段,SQL Server尝试计算查询各个阶段(例如串联)的中间结果的基数。 由于排序规则冲突解决发生在最末端,因此查询优化器可能不知道它,并尝试对具有冲突排序规则的输入执行串联基数的计算。

解决方法

以下SQL Server累积更新中修复了此问题:

SQL Server 2016 SP1 的累积更新 8

2017 SQL Server累积更新 4

SQL Server 2014 SP2 的累积更新 9

关于SQL Server的累积更新:

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

SQL Server 2016 年的最新累积更新

SQL Server 2017 的最新累计更新

SQL Server 2014 年的最新累积更新

状态

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

参考资料

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