基于ISNULL()
上documentation的返回类型部分:
返回与 check_expression 相同的类型。如果将文字
NULL
作为 check_expression 提供,则返回 replacement_value 的数据类型。 如果将文字NULL
作为 check_expression 提供,而没有提供 replacement_value ,则返回int
。
在这种情况下,为什么ISNULL()
返回int
?
答案 0 :(得分:8)
为什么
SELECT ISNULL(NULL, NULL)
返回类型为INT
的列
在没有任何其他上下文的情况下,文字NULL
在SQL Server中通常仅被视为int
。因此,这与“返回与check_expression
相同的类型”一致。
如果您执行SELECT NULL AS Col INTO SomeTable
并查看创建的列数据类型,也可以看到此内容。
或者在这个愚蠢的递归CTE示例中也可以看到它
WITH R(C) AS
(
SELECT NULL
UNION ALL
SELECT 0.0 FROM R WHERE 1 = 0
)
SELECT *
FROM R
哪个返回
消息240,级别16,状态1,第1行类型之间不匹配 锚和递归查询“ R”的列“ C”中的递归部分。
但是用0.0
代替0
可以正常工作,因此递归部分中的列是int
而不是decimal
。
为什么会这样?
这正是SQL Server决定从那时开始的做法。我怀疑他们是否会出于向后兼容的原因而更改行为,即使它有点武断并且probably not consistent with the SQL Standard
所有这些都有些随意性,也显示在
SELECT NULLIF(NULL, NULL)
您可能希望它的行为相同,并返回一个INT
,但会出现错误
NULLIF的第一个参数的类型不能为NULL常量 因为必须知道第一个参数的类型。
然后COALESCE(NULL,NULL)
返回
COALESCE的至少一个参数必须是以下表达式: 不是NULL常量。