KB4046745 - 修复:在 SQL Server 2014、2016 或 2017 中的 WHERE 子句中引用不存在的分区函数时,UPDATE 语句失败时无提示

应用对象
SQL Server 2014 Service Pack 2 - duplicate (do not use) 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 2017 Developer SQL Server 2017 Enterprise Core SQL Server 2017 Enterprise 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)

症状

假设您有一个 UPDATE 语句,该语句使用 Microsoft SQL Server 2014、2016 或 2017 中的 $PARTITION 关键字 (keyword) 引用不存在的分区函数。 例如,

注意

UPDATE TableName SET ColumnName='xyz' WHERE $PARTITION.NonExistingPartitionFunction (ColumnName) = 1

在这种情况下,SQL Server 不会执行更新或返回错误消息来指示 NonExistingPartitionFunction 对象不存在。 然而,从用户的角度来看, 看似 UPDATE 语句执行成功,但实际上失败了。

原因

执行批处理时,SQL Server可能会执行延迟的名称解析 (DNR) 。 在此过程中,当 SQL Server 遇到不存在的对象时不会立即生成错误,它预计对象将在引用该对象的语句执行之前由模块或批次创建。 对于分区函数,SQL Server 无法正确处理 DNR。

详细信息

有关 DNR 的详细信息,请参阅 延迟名称解析。

解决方法

此问题已在 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 用于描述软件更新的术语。