SQL - 如何在计算列上更改COLUMN

时间:2010-02-16 16:34:06

标签: sql sql-server

我正在使用SQL Server 2008.是否可以更改计算列而不实际删除列然后再次添加它(我可以开始工作)?例如,我有这个表:

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)

但这不正确。如果可能,或者有其他解决方案,我将不胜感激。

5 个答案:

答案 0 :(得分:19)

不幸的是,如果不先删除列,就不能这样做。

<强> From MSDN

  

ALTER COLUMN
  指定要更改或更改命名列。如果兼容级别为65或更低,则不允许使用ALTER COLUMN。有关更多信息,请参见sp_dbcmptlevel(Transact-SQL)。

     
      
  • 修改后的列不能是以下任何一种:

         
        
    • 计算列或在计算列中使用。
    •   
  •   

答案 1 :(得分:0)

NO

如果计算出来,丢掉它并重新添加它有什么大不了的?它是PERSISTED并且有数百万行?

答案 2 :(得分:0)

我不认为你可以改变这个专栏而不用掉线。 因此,删除列,然后添加新列。

如果您发现其他任何方法,请告诉我。

答案 3 :(得分:0)

如果您必须维护订单,请将数据复制到重复的表中,然后重建表以保持列顺序,然后将数据从重复表中复制回来。

当没有活动时,请确保这样做。

答案 4 :(得分:-4)

很容易克服零误差

使用

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

如果该列为0,它将返回null,

而不是使用上面的示例

进行更新

同时阅读计算列的第3个标准化