【问题标题】:SQL - How to ALTER COLUMN on a computed columnSQL - 如何在计算列上更改列
【发布时间】:2010-02-16 16:34:05
【问题描述】:

我正在使用 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)

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

【问题讨论】:

  • 列顺序在 SQL Server 中是完全不相关的——为什么还要保留它呢?删除和重新创建是唯一的方法。
  • 如果您编写的查询依赖于列顺序,请停止。
  • 有时需要保留列顺序。例如,如果您的客户使用 bcp 导入数据并使用格式文件。然后格式文件也需要更改,如果您在客户网站上进行任何进一步更新,则需要始终记住这一点。
  • @marc_s 列顺序不是无关的。如果您在列列表的中间或末尾添加/删除列,SQL Server 处理表更新的方式非常不同:这可能意味着延迟数小时。愚蠢,但非常令人恼火的行为。即使是微小的修正,也绝对会阻碍生产更新。

标签: sql sql-server


【解决方案1】:

很遗憾,如果不先删除该列,您将无法执行此操作。

From MSDN

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

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

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

【讨论】:

  • 不过,您可以使用临时表as demonstrated in this answer here 保留计算列数据。
  • @Amicable 不再是 computed 列,因此它是完全不同的情况和一组限制。
【解决方案2】:

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

请务必在没有活动进行时执行此操作。

【讨论】:

    【解决方案3】:

    没有

    如果它是计算出来的,那么删除它并再次添加它有什么大不了的?它是 PERSISTED 并且有数百万行吗?

    【讨论】:

      【解决方案4】:

      我不认为您可以不删除就更改此列。 所以删除列然后添加新列。

      如果您发现任何其他方法可以做到这一点,请告诉我。

      【讨论】:

        【解决方案5】:

        很容易克服除以零的错误

        使用

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

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

        使用上面的例子代替 alter go for update

        另请阅读计算列的第三次归一化

        【讨论】:

          猜你喜欢
          • 2010-09-07
          • 2022-01-11
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 2010-10-07
          • 2019-07-02
          相关资源
          最近更新 更多