视图因不在结果集中的行上的算术溢出而损坏

问题描述 投票:0回答:1

一段时间内未发生变化的视图现在因算术溢出而失败。我已经确定了导致问题的行,它是一个“旧”行,已经存在多年并且没有变化。该行不构成最终结果集的一部分,因此看起来我在

CAST
子句中执行的
SELECT
操作正在过滤数据集之前进行评估。

相关列未在任何

JOIN
WHERE
条件下被引用,因此没有理由在过滤之前对其进行评估。

我尝试了各种方法来使其被过滤掉,包括基础表上的

FORCE ORDER
查询提示和
UPDATE STATISTICS
(以防这会导致查询优化器失效),但没有成功。

有没有办法告诉优化器首先过滤数据?我不想篡改数据以使其发挥作用。

sql-server t-sql
1个回答
0
投票

看来我在 SELECT 子句中执行的 CAST 操作正在过滤数据集之前进行评估。

对于 SQL Server 来说,这已经是可能的......甚至很常见......生成这样的执行计划至少可以追溯到 SQL Server 2000(可能更久)。有许多 SQL Server 可能决定在过滤数据之前评估这些表达式,并且您几乎无法强制事情以其他方式工作。

通常,这表明您的模式存在设计问题,但对于难以修复的现有系统,您可能需要切换到较新的

TRY_CAST()
方法。

© www.soinside.com 2019 - 2024. All rights reserved.