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