Почему мое выражение CASE недетерминировано?

Я пытаюсь создать постоянный вычисляемый столбец, используя выражение 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 ответа

Решение

Вам нужно конвертировать '20100101' со стилем.

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

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

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

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

Редактировать:

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

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

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date ]> Convert(DateTime, '20100101', 101) THEN  [Date]
    ELSE Convert(DateTime, NULL, 101)
    END PERSISTED
Другие вопросы по тегам