我正在使用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)
但这不正确。如果可能,或者有其他解决方案,我将不胜感激。
答案 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个标准化