【发布时间】:2014-02-21 00:33:50
【问题描述】:
以下查询因算术溢出错误而意外失败。
select IsNull(t2.val, 5005)
from(
SELECT 336.6 as val UNION ALL
SELECT NULL
) as t2
“将 int 转换为数据类型 numeric 的算术溢出错误。”
奇怪的是,如果修改查询以删除 NULL 并将其替换为与 null 合并 (5005) 中相同的值,则它可以正常运行
select IsNull(t2.val, 5005)
from(
SELECT 336.6 as val UNION ALL
SELECT 5005
) as t2
此外,完全省略 SELECT NULL 行允许查询运行而不会出现问题
select IsNull(t2.val, 5005)
from(
SELECT 336.6 as val
) as t2
如果 IsNull 函数中的 coalesce 值更改为一个整数,该整数小到足以在子查询中转换为小数而不加宽,则查询运行
select IsNull(t2.val, 500)
from(
SELECT 336.6 as val UNION ALL
SELECT NULL
) as t2
在 SQL Server 2005 和 SQL Server 2008 中都对此进行了测试。
通常将整数与小数结合起来是无缝的,SQL Server 会将整数和小数都转换为足够大的小数类型以容纳两者。但是由于某种原因,运行一个查询同时发生了来自 UNION 和 IsNull 的转换,导致转换失败。
有人知道这是为什么吗?
【问题讨论】:
-
到目前为止,没有一个答案可以解释
ISNULL和COALESCE之间的区别。第一个严格返回第一个参数的数据类型,第二个查看所有参数。例如见DECLARE @X VARCHAR(3) SELECT ISNULL(@X,'Longer Than 3 characters'), COALESCE(@X,'Longer Than 3 characters') -
该问题简短地提到了
COALESCE,但最后一段的摘要问题只是关于ISNULL。但感谢您的好评。 -
@Szymon - 是的,你是对的。一定是刚刚浏览了一下,看到
ISNULL和COALESCE都提到并假设这是测试用例之一。
标签: sql sql-server