2010-05-07 5 views
1

Почему это провал:SQL 2008 сазе Обострение

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

Msg 241, Level 16, State 1, Line 2 Конверсия удалось при преобразовании даты и/или времени из строки символов.

Почему она пытается преобразовать dasf на сегодняшний день, когда она явно вызывает IsDate (@date) = 1, чтобы оценить ложь ...

Если я:

SELECT ISDATE(@DATE) 

Возвращение значение равно 0.

+1

Столбец может быть только одним типом данных - это либо DATE, либо VARCHAR (50). –

ответ

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

+0

Что вы хотите сделать, если это не дата, вы хотите фактически вернуть значение, не относящееся к дате? В чем смысл итогового столбца. – Mike

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 

ВЫВОД:

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

(2 row(s) affected) 

В рабочем примере, я сделал замену от date типа данных datetime, потому что я на SQL Server 2005 и date тип данных только SQL Server 2008.

+0

Спасибо, этот пример позволил мне сформулировать способ сделать именно то, что мне нужно ... – Brad

Смежные вопросы