SQL 2008 CASE语句恶化

Bra*_*rad 1 sql t-sql sql-server

为什么会失败:

DECLARE @DATE VARCHAR(50) = 'dasf'
SELECT CASE WHEN ISDATE(@DATE) = 1 THEN CONVERT(date,@DATE) ELSE @DATE END
Run Code Online (Sandbox Code Playgroud)

消息241,级别16,状态1,行2转换在从字符串转换日期和/或时间时失败.

为什么它明确导致ISDATE(@DATE)= 1评估为false时尝试将dasf转换为日期...

如果我做:

SELECT ISDATE(@DATE)
Run Code Online (Sandbox Code Playgroud)

返回值为0.

Amy*_*y B 6

CASE返回单一类型.在这种情况下,类型是Date,可以从THEN子句中找到.它隐式地将ELSE子句结果转换为Date以匹配.

您必须选择CASE返回的单一类型.它不能用于返回有时Date和有时varchar.

来自MSDN:http: //msdn.microsoft.com/en-us/library/ms181765.aspx

退货类型

返回result_expressions中的类型集和可选的else_result_expression中的最高优先级类型.有关更多信息,请参阅数据类型优先级(Transact-SQL).

然后关注该链接:http://msdn.microsoft.com/en-us/library/ms190309.aspx

8)约会

27)varchar


目前还不清楚你想要什么,所以很难提供替代方案(我不知道CASE是否是更大的查询或脚本的一部分),但这里有几件你可以做的事情:

-- choose a single return type per CASE expression
SELECT
  CASE
    WHEN IsDate(@Date) = 1
    THEN convert(date, @Date)
    ELSE null
  END as [Date],
  CASE
    WHEN IsDate(@Date) = 1
    THEN null
    ELSE @Date
  END as [VarChar]

--use control flow to select what you want.
IF IsDate(@Date) = 1
THEN
  SELECT convert(date, @Date)
ELSE
  SELECT @Date
Run Code Online (Sandbox Code Playgroud)