Добавление вычисляемого поля для преобразования строкового значения в дату в T-SQL - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь добавить вычисляемое поле в существующую таблицу в SSMS, которая преобразует строку в формате YYYYMMDD в формат даты, но я получаю ошибки, касающиеся того, что строковое поле недопустимо.

Мне требуется вычисляемое поле, поскольку в строковом поле у ​​меня есть значения '00000000' (т. Е. NULL), поэтому я не могу использовать это в вычислениях даты.

Код, который я использую:

ALTER TABLE [TEM].[AssignmentRates] 
    ADD [Date_Expired] DATE NULL
    (SELECT CONVERT([date], CASE WHEN [Expiry_Date]='00000000' THEN NULL ELSE [Expiry_Date] END))

, где [Expiry_Date] - столбец строки, который я пытаюсь преобразовать, а [Date_Expired] - имя вычисляемого столбца, который я пытаюсь добавить.

Я получаю эту ошибку:

Неверное имя столбца 'Expiry_Date'

для обоих экземпляров этого имени поля и не может понять, почему. Если я запускаю запрос как отдельный SELECT, он возвращает требуемые результаты.

Использование псевдонимов таблицы или полного имени базы данных, таблицы и столбца для него также не работают.

Возможно, это что-то невероятно очевидное, но я не смог понять, что это такое.

Ответы [ 3 ]

2 голосов
/ 01 октября 2019

Ошибка на expiry_date кажется вполне понятной - это не имя столбца в таблице. Но вы можете упростить логику:

ALTER TABLE TEM.AssignmentRates ADD Date_Expired AS
    (TRY_CONVERT(date, Expiry_Date));

На самом деле, вложенная SELECT могла вызвать проблему. Это обычно не используется для вычисляемого столбца.

0 голосов
/ 02 октября 2019

Ваш синтаксис был недопустим для вычисляемого столбца. На самом деле у вас было добавление обычного столбца (успешно), но затем попытка выполнить оператор select, который вызывал те ошибки имени столбца, поскольку у него не было условия from для контекста.

ALTER TABLE TEM.AssignmentRates /* don't do this */
ADD Date_Expired DATE NULL /* implied end of statement */
(SELECT CONVERT(date, CASE WHEN Expiry_Date = '00000000' THEN NULL ELSE Expiry_Date END));

Если бы вы использовали правильный синтаксис, вы бы по крайней мере получили информативную ошибку:

ALTER TABLE TEM.AssignmentRates /* error! */
ADD Date_Expired AS
  (SELECT CONVERT(date, CASE WHEN Expiry_Date = '00000000' THEN NULL ELSE Expiry_Date END);

/*ERROR: Subqueries are not allowed in this context. Only scalar expressions are allowed.*/

Но на самом деле вам не нужен был подзапрос:

ALTER TABLE TEM.AssignmentRates /* success */
ADD Date_Expired AS
  CONVERT(date, CASE WHEN Expiry_Date = '00000000' THEN NULL ELSE Expiry_Date END);

Гордон имеет смысл просто использовать try_convert().

0 голосов
/ 01 октября 2019

Похоже на синтаксис

alter table [TEM].[AssignmentRates] 
    ADD [Date_Expired]
as 
(
case Expiry_Date when '00000000' then null else cast(Expiry_Date as date) end
)
...