我在使用a的SQL语句中表达了一些奇怪的行为CASE.它可以通过以下示例重现:
SELECT
CASE
WHEN 1=1
THEN 'foo'
WHEN 1=2
THEN (DATEADD(s, 1435586700, '01/01/1970 00:00:00'))
WHEN 1=3
THEN (DATEADD(s, 1435586700, '01/01/1970 00:00:00'))
ELSE
'bar'
END AS result
Run Code Online (Sandbox Code Playgroud)
如果在SQL Server 2008上执行此操作,则不返回任何结果.只要您为第二个或第三个案例更改它成功,它就会返回一个值.如果您完全删除这些案例,它可以正常工作.
起初我认为DATEADD在任何情况下执行都是一个问题,并且由于传递的参数值而失败.但在我的例子中,它们是不变的,无论如何都应该有效.
这里发生了什么?
case是一个表达式,其类型在编译时确定.但是,直到运行时才会实际评估这些值.
通过类型转换的规则,我认为表达式将返回一个datetime.这会导致'foo'和'bar'值的错误- when满足条件时.