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

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

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

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

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

Msg 4936, уровень 16, состояние 1, строка 1 Вычисленный столбец "Предыдущее значение" в Таблица "Календарь" не может сохраняться потому что столбец недетерминированная.

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

Ответ 1

Вам нужно CONVERT '20100101' со стилем.

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

Итак, попробуйте следующее:

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

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

Edit:

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

Ответ 2

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

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