Вычисляемый столбец на основе другого вычисляемого столбца? - PullRequest
11 голосов
/ 04 декабря 2009

У меня есть вычисляемый столбец с именем Cost, который возвращает деньги.

Я хочу получить еще один столбец, который возвращает (Cost * 2), но он не позволяет мне.

Ответы [ 2 ]

16 голосов
/ 04 декабря 2009

Вычисляемые столбцы не могут ссылаться на другие вычисляемые столбцы. Хотя вы должны иметь возможность просто повторить выражение, на которое вы хотели бы сослаться. Из MSDN :

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

Я также должен добавить, что, если бы это работало так, как вы надеетесь, это вызвало бы все виды новых проблем, с которыми вам пришлось бы иметь дело. В настоящее время обновления во многих столбцах / строках происходят параллельно и атомарно.

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

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

6 голосов
/ 04 декабря 2009

Вы должны определить его относительно базовых столбцов в таблице .

computed_column_expression является выражение, которое определяет значение вычисляемый столбец. Вычисляемый столбец виртуальный столбец, который не физически хранится в таблице, если столбец помечен как PERSISTED. столбец вычисляется из выражения который использует другие столбцы в том же Таблица. Например, вычисляемый столбец может иметь определение: стоимость как цена * кол-во Выражение может быть не вычисляемым именем столбца, константой, функция, переменная и любой Сочетание этих связанных одним или больше операторов. Выражение не может быть подзапросом или содержать псевдоним типы данных.

Хотя вы могли бы реорганизовать их оба для использования одного и того же скалярного UDF (передать во всех одинаковых столбцах) для упрощения обслуживания и обеспечения согласованности логики, снижение производительности будет огромным, и я использую только скалярные UDF в качестве последнего средства.

...