即使CONVERT函数未被调用SQL,也会出现转换失败错误

时间:2013-06-21 15:12:28

标签: sql-server tsql

如果给定变量是日期,我使用此命令选择所有特定日期,如果不是,则应返回所有字段。

@query采用日期形式时,命令有效,但会返回错误:

“从字符串转换日期和/或时间时转换失败。”

当它是任何其他任意字符串时。

代码:

select * from table where

format(dateofbirth,'dd/MMM/yyyy') = Case 
    when ISDATE(@query)=1 then 
        format(CONVERT(datetime,@query),'dd/MMM/yyyy')  
    else
        format(dateofbirth,'dd/MMM/yyyy')

修改

@query可以是例如的任何字符串。 “1/1/2013”​​,“随机”,“3”。

如果@query不是日期形式,该命令应返回所有字段。

1 个答案:

答案 0 :(得分:1)

您可以通过重新制定查询条件来解决此问题,如下所示:

declare @query as varchar(20)='blah'
SELECT *
FROM testtable
WHERE ISDATE(@query) = 0
   OR CONVERT(date, dateofbirth) = CASE ISDATE(@query)
       WHEN 1 THEN CONVERT(date, @query) ELSE NULL
   END

Demo on sqlfiddle.

问题是逻辑运算符在SQL中没有短路,因此优化器将CONVERT(date, @query)视为可以预先计算以加速查询的内容。通过将条件扩展为完全取决于CASE的{​​{1}},您可以在@query返回“false”时消除CONVERT分支的执行。