为什么ISNULL(NULL,NULL)返回int数据类型?

时间:2020-02-29 21:50:07

标签: sql sql-server tsql

基于ISNULL()documentation的返回类型部分:

返回与 check_expression 相同的类型。如果将文字NULL作为 check_expression 提供,则返回 replacement_value 的数据类型。 如果将文字NULL作为 check_expression 提供,而没有提供 replacement_value ,则返回int

在这种情况下,为什么ISNULL()返回int

1 个答案:

答案 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常量。