Vb.net 为什么CASE表达式中的隐式转换现在返回零而不是空?

Vb.net 为什么CASE表达式中的隐式转换现在返回零而不是空?,vb.net,sql-server-2017,Vb.net,Sql Server 2017,SQL查询中的CASE表达式突然开始返回零而不是空。现在,我明白了返回零的原因,但直到2019年8月22日,当我在使用它的VB.NET程序中对此查询做了一个小更改时,它一直返回空白。为什么?什么改变了 具体来说,CASE表达式基于数据库表中的DOB(出生日期)字段返回一个人的年龄。如果DOB是空的,我希望它返回空的。如果它不是空的,我希望它使用我在stackoverflow上找到的这段漂亮代码计算年龄: (0 + CONVERT(CHAR(8), GETDATE(), 112) - CONVER

SQL查询中的CASE表达式突然开始返回零而不是空。现在,我明白了返回零的原因,但直到2019年8月22日,当我在使用它的VB.NET程序中对此查询做了一个小更改时,它一直返回空白。为什么?什么改变了

具体来说,CASE表达式基于数据库表中的DOB(出生日期)字段返回一个人的年龄。如果DOB是空的,我希望它返回空的。如果它不是空的,我希望它使用我在stackoverflow上找到的这段漂亮代码计算年龄:

(0 + CONVERT(CHAR(8), GETDATE(), 112) - CONVERT(CHAR(8), CAST(DOB AS date), 112)) / 10000
这是一个CASE表达式:

SELECT 
     CASE WHEN DOB <> '' THEN 
          (0 + CONVERT(CHAR(8), GETDATE(), 112) - CONVERT(CHAR(8), CAST(DOB AS date), 112)) / 10000 
     ELSE '' 
     END 
AS Age 
FROM TableName
选择
当DOB“”时的情况
(0+转换(CHAR(8),GETDATE(),112)-转换(CHAR(8),CAST(DOB AS date),112))/10000
否则“
结束
随着年龄的增长
从表名

我通过将年龄计算的结果转换为varchar解决了这个问题,所以,这不是我的问题。我的问题是,为什么这个CASE表达式在2019年8月21日之前一直返回空白(“”),现在它返回零?

我相当确定它应该“始终”返回一个数字:“从result\u表达式和可选的else\u result\u表达式的类型集中返回优先级最高的类型。”没有相关服务器标志或行为更改的备注;因此,我的假设是:1)原始代码或输出与相信/预期的不同;2) 客户机代码的变化要么导致了差异,要么导致了对被认为是不同的行为的感知。也就是说:“……但直到2019年8月22日,当我在使用它的VB.NET程序中对此查询进行了一个小的更改”似乎值得探索,以及如何在VB中处理结果集。也显示您的VB.NET代码。。。在你的“小”变化之前和之后,谢谢你的回复。我知道它应该“始终”返回一个数字的所有原因,但我向您保证,在2019年8月22日之前,它返回了一个空字符串。对VB代码的更改只是在查询中添加了另一个字段。VB代码中如何处理它并不重要,但本质上,如果年龄字段为空,意味着记录不包含DOB,则需要搜索另一个名为Notes的字段,以查找字符串值“Age=[int]”,并提取并使用int值。你的基本格律。无论如何,问题不是关于VB,而是关于SQL Server。我相当确定它应该“始终”返回一个数字:“从结果表达式和可选的else_结果表达式中的类型集中返回优先级最高的类型。”没有相关服务器标志或行为更改的注释;因此,我的假设是:1)原始代码或输出与相信/预期的不同;2) 客户机代码的变化要么导致了差异,要么导致了对被认为是不同的行为的感知。也就是说:“……但直到2019年8月22日,当我在使用它的VB.NET程序中对此查询进行了一个小的更改”似乎值得探索,以及如何在VB中处理结果集。也显示您的VB.NET代码。。。在你的“小”变化之前和之后,谢谢你的回复。我知道它应该“始终”返回一个数字的所有原因,但我向您保证,在2019年8月22日之前,它返回了一个空字符串。对VB代码的更改只是在查询中添加了另一个字段。VB代码中如何处理它并不重要,但本质上,如果年龄字段为空,意味着记录不包含DOB,则需要搜索另一个名为Notes的字段,以查找字符串值“Age=[int]”,并提取并使用int值。你的基本格律。无论如何,问题不是关于VB,而是关于SQL Server。