2010-05-07 136 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