2010-02-16 3 views
13

Я работаю с SQL Server 2008. Возможно ли изменить вычисленный столбец, не опуская столбца, а затем добавив его снова (что я могу приступить к работе)? Например, у меня есть эта таблица:SQL - как ALTER COLUMN на вычисленном столбце

CREATE TABLE [dbo].[Prices](
[Price] [numeric](8,3) NOT NULL, 
[AdjPrice] AS [Price]/[AdjFactor], 
[AdjFactor] [numeric](8,3) NOT NULL) 

Позже понял, что у меня есть потенциал деления на ноль, я хочу, чтобы изменить столбец [Adjprice], чтобы справиться с этим, но если я просто перенесите колонку и добавить его снова , Я теряю порядок столбцов.

Я хочу сделать что-то вроде:

ALTER TABLE dbo.[Prices] 
ALTER COLUMN [AdjPrice] AS (CASE WHEN [AdjFactor] = 0 THEN 0 ELSE [Price]/[AdjFactor] END) 

Но это не правильно. Если это возможно, или есть другое решение, я был бы признателен за помощь.

+1

Какой порядок столбцов? – MartW

+2

порядок столбцов абсолютно не имеет отношения к SQL Server в любом случае - зачем беспокоиться о его сохранении? Падение и воссоздание - единственный путь. –

+1

Если вы пишете свои запросы так, чтобы они зависели от порядка столбцов, остановитесь. –

ответ

19

К сожалению, вы не можете сделать это, не отбрасывая сначала столбец.

From MSDN:

ALTER COLUMN
Указывает, что названный столбец должен быть изменен или изменен. ALTER COLUMN не допускается, если уровень совместимости равен 65 или ниже. Для получения дополнительной информации см. Sp_dbcmptlevel (Transact-SQL).

  • Модифицированный столбец не может быть одним из следующих:

    • Вычисляемый столбец или использоваться в вычисляемого столбца.
+0

Однако вы можете сохранить данные столбца расчета, используя временную таблицу [как показано в этом ответе здесь] (http://stackoverflow.com/a/23134891/1193596). – Amicable

+0

@ Возможно, это больше не * вычисляемый столбец *, поэтому это совершенно другой случай и набор ограничений. –

0

NO

, если он вычисляется, что такое большое дело уронить и добавить его снова? это PERSISTED и есть миллион строк?

0

Я не думаю, что вы можете изменить эту колонку без капли. Итак, опустите колонку, затем добавьте новую колонку.

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

-4

его легко преодолеть разрыв на ноль

использования

SELECT 
(100/NULLIF(0, 0)) AS value 

вернет нуль, если 0 в этой колонке,

вместо альтер пойти на обновление, используя выше пример

Также читается 3-я нормализация для вычисленного столбца

0

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

Просто обязательно сделайте это, когда нет деятельность продолжается.

Смежные вопросы