Я пытаюсь создать столбец со значением по умолчанию. Значение по умолчанию вычисляется следующим образом:
Содержит ли столбец «Период» (та же таблица) текущий год? Если это так, то значением по умолчанию является столбец «AnswerA» (та же таблица).
Если он не содержит текущий год, значением по умолчанию является столбец «AnswerB» (та же таблица).
Я считаю, что это должно быть сделано так:
CREATE TABLE dbo.[testComputed](
[Id] int IDENTITY(1,1) NOT NULL,
[Period] nvarchar(100) NOT NULL,
[AnswerA] char NOT NULL,
[AnswerB] char NOT NULL,
[ComputedColumn] char NULL DEFAULT (
iif ( [Period] Contains(CONVERT(nvarchar(5),YEAR(GETDATE()))), [AnswerA], [AnswerB]))
Столбец Period не является типом Date, это что-то вроде этого: 01/2019
Я не уверен, возможно ли это вообще, я надеюсь, что это правильно, но мне не хватает некоторых базовых знаний, чтобы выполнить это.
Я не упоминал об этом, но я хочу, чтобы этот столбец можно было редактировать. И вычисляемый столбец не может быть, насколько я понимаю.
Нет, вы не можете, потому что это не разрешено в SQL Server, вам нужен вычисляемый столбец, чтобы вернуть значение одного столбца.


Вы можете определить столбец как:
ComputedColumn as (case when Period like concat('%', year(getdate()), '%')
then AnswerA else AnswerB
end)
ComputedColumn вычисляется, когда данные извлекаются из таблицы. Таким образом, когда меняется год, меняется и значение.
Я не уверен, что означает «редактируемый». Значение по умолчанию для столбца не может содержать ссылки на столбцы (может быть способ обойти это с помощью определяемых пользователем функций, но это кажется излишним).
Поскольку данные всегда вставляются в текущем году, вы можете использовать триггер для присвоения значения.
Однако может быть лучше просто использовать столбец значения переопределения (который можно обновить), а затем:
OverrideValue char(1),
ComputedColumn as (case when OverrideValue is not null
then OverrideValue
when Period like concat('%', year(getdate()), '%')
then AnswerA else AnswerB
end)
Вы ищете вычисляемый столбец. Как определить, есть ли у
Periodтекущий год?