Почему мое выражение CASE недетерминировано? - PullRequest
6 голосов
/ 30 августа 2010

Я пытаюсь создать постоянный вычисляемый столбец, используя выражение CASE:

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date]>'20100101' THEN  [Date]
    ELSE NULL
    END PERSISTED

MSDN четко говорит, что CASE детерминирован, здесь

Однако я получаю сообщение об ошибке:

Сообщение 4936, уровень 16, состояние 1, строка 1 Вычисляемый столбец «PreviousDate» в таблица «Календарь» не может быть сохранена потому что столбец недетерминирована.

Конечно, я могу создать скалярный UDF и явно объявить его детерминированным, но есть ли более простой способ обойти это? Я уже нахожусь в процессе получения последнего пакета обновления. Спасибо.

Ответы [ 2 ]

17 голосов
/ 30 августа 2010

Вам нужно КОНВЕРТ '20100101' со стилем.

Тип источника или цели: datetime или smalldatetime, другой источник или целевой тип является символьной строкой, и указан недетерминированный стиль.

Итак, попробуйте это:

...WHEN [Date] > CONVERT(datetime, '20100101', 112)....

Разбор даты из строки может быть ненадежным, как Я уже отвечал (в основном в комментариях)

Edit:

Я бы не сказал, что это ошибка, но SQL Server требует 100% разъяснений. ггггммдд не ISO и разбор SQL Server ненадежен гггг-мм-дд (см. ссылку на мой ответ)

5 голосов
/ 30 августа 2010

Очевидно, это очень требовательно к типам данных. Попробуйте сделать это:

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date ]> Convert(DateTime, '20100101', 101) THEN  [Date]
    ELSE Convert(DateTime, NULL, 101)
    END PERSISTED
...