2010-05-07 143 views
1

为什么会出现这种失败:SQL 2008 CASE语句加重

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

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

为什么试图转换dasf到年月日时它显然会导致ISDATE(@DATE)= 1,以评估为假......

如果我做的:

SELECT ISDATE(@DATE) 

返回值为0.

+1

列只能是一种数据类型 - 它可以是DATE或VARCHAR(50)。 – 2010-05-07 17:45:10

回答

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 
+0

谢谢。有什么替代方法可以做我需要的吗? – Brad 2010-05-07 17:44:47

+0

如果您不想要实际返回非日期值,那么您想要做什么?结果栏的含义是什么? – Mike 2010-05-07 17:55:06

2

试试这个:

DECLARE @DATE VARCHAR(50) = 'dasf' 
SELECT CASE 
      WHEN ISDATE(@DATE)=1 THEN CONVERT(char(23),CONVERT(date,@DATE),121) 
      ELSE @DATE 
     END 

它基本上会格式化您的有效日期,并独自离开非日期。那是你的追求?

实际工作样本:

DECLARE @YourTable table (DATE VARCHAR(50)) 
INSERT @YourTable VALUES ('dasf') 
INSERT @YourTable VALUES ('1/1/2010') 

SELECT 
    CASE 
     WHEN ISDATE(DATE)=1 THEN CONVERT(char(23),CONVERT(datetime,DATE),121) 
     ELSE DATE 
    END AS DATE 
    FROM @YourTable 

OUTPUT:

DATE 
-------------------------------------------------- 
dasf 
2010-01-01 00:00:00.000 

(2 row(s) affected) 

在该工作例子,我做了一个替代从date数据类型datetime因为我是SQL Server 2005和date数据类型上仅限SQL Server 2008。

+0

谢谢,这个例子让我能够制定一种方法来完成我所需要的... – Brad 2010-05-10 13:01:48