UPDATE查询溢出的数据类型在不需要的行上

时间:2018-04-11 06:02:14

标签: sql sql-server

我有一张桌子,比如CREATE TABLE #t(col1 int)。然后,INSERT INTO #t VALUES(1)

现在我尝试通过两种方式进行假int溢出:

UPDATE #t
SET col1 = 999999*999999
WHERE col1 = 2

UPDATE #t
SET col1 = 999999*999999
WHERE 1 = 2

虽然两个查询都不会实际更新任何行,但第一个查询引发了int overflow错误,但第二个查询没有。

当问题更可能发生在生产事件上时,事情会变得棘手,比如说,一个表有一些值列和一个类别列。执行查询:

UPDATE table
SET column = <a computation from other columns>
WHERE category = <category>

假设某些不在此类别中的数据会因计算而溢出,查询将在执行期间或不会引发错误,可能取决于SQL服务器的执行计划。

但我很好奇为什么SELECT可能在'WHERE'首先运行之前计算出来,对常见SQL查询的常见执行顺序没有意义??如果出现这样的问题,我们怎么能绕过它呢?

1 个答案:

答案 0 :(得分:0)

我的猜测是,在查询计划达到要在SET子句中使用的值之前,第二个查询失败。也就是说,首先评估WHERE子句,并且由于它失败,查询永远不会进行到达堆栈溢出错误。

实际上,在生产环境中,有问题的查询可能会有一个WHERE条款,至少在某些时候是这样。因此,您至少偶尔会在日志中看到堆栈溢出错误。