Почему мое выражение 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