Обострение оператора SQL 2008 CASE - PullRequest
1 голос
/ 07 мая 2010

Почему это не получается:

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 оценивается как false ...

Если я это сделаю:

SELECT ISDATE(@DATE)

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

Ответы [ 2 ]

6 голосов
/ 07 мая 2010

CASE возвращает один тип. В этом случае типом является Дата, найденная из вашего предложения 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) варчар


Непонятно, чего вы хотите, поэтому сложно предложить альтернативы (я не знаю, является ли 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
2 голосов
/ 07 мая 2010

попробуйте это:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...