为什么我的 CASE 语句中的后续未满足条件会影响我的返回数据类型?

Mik*_*e S 4 sql-server datatypes case sql-server-2016

我有以下变量和 CASE 语句:

DECLARE @DATE_VALUE VARCHAR(20) = '4/29/2021'
DECLARE @CONVERT_CODE VARCHAR(1) = 'I'

SELECT CASE @CONVERT_CODE WHEN 'I' THEN DATEDIFF(day, '04/21/2021', @DATE_VALUE)
       END AS ConvertedValue
Run Code Online (Sandbox Code Playgroud)

它没有什么特别之处。正如我所期望的那样,它返回 8 (int)。

但是,一旦我将返回日期时间数据类型的条件添加到我的 CASE 语句中,我就不再得到 8 (int),尽管继续使用“I”作为 @CONVERT_CODE 值。

DECLARE @DATE_VALUE VARCHAR(20) = '4/29/2021'
DECLARE @CONVERT_CODE VARCHAR(1) = 'I'

SELECT CASE @CONVERT_CODE WHEN 'I' THEN DATEDIFF(day, '04/21/2021', @DATE_VALUE)
                          WHEN 'D' THEN GETDATE()
       END AS ConvertedValue
Run Code Online (Sandbox Code Playgroud)

相反,我得到“1900-01-09 00:00:00.000”的日期时间值

我认为“D”根本不应该被评估,因为在 SQL Server 中,一旦条件评估为真(在这种情况下为“I”),它应该脱离 CASE 语句——所以我不确定为什么“D”的数据类型会影响整体返回数据类型。另外,如果我颠倒条件的顺序并仍然使用“I”也没关系:

DECLARE @DATE_VALUE VARCHAR(20) = '4/29/2021'
DECLARE @CONVERT_CODE VARCHAR(1) = 'I'

SELECT CASE @CONVERT_CODE WHEN 'D' THEN GETDATE()
                          WHEN 'I' THEN DATEDIFF(day, '04/21/2021', @DATE_VALUE)
       END AS ConvertedValue
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Pau*_*ite 6

CASE与所有列一样,表达式定义的列具有数据类型。

SQL Server 以通常的方式确定结果类型,利用数据类型优先级。该类型datetime的优先级高于integer.

您可能希望CASE表达式在不同的路径上返回不同的类型,但这是不可能的(sql_variant旁白)。