【问题标题】:Convert computed column to regular column将计算列转换为常规列
【发布时间】:2011-05-07 19:55:30
【问题描述】:

我在 SQL Server 2005 的一个大表中有一个持久计算列。

我想将其转换为常规列,保留当前值。

我是否必须在事务中重新创建列并更新整个表, 或者是否可以只更改计算列规范,以及如何做到这一点?

【问题讨论】:

    标签: sql-server database schema calculated-columns


    【解决方案1】:
    -- Create a new Column (unpersisted):
    ALTER TABLE MyTable
       ADD newColumn DatatypeOfPersistedColumn
    GO
    
    UPDATE myTable
    SET newColumn = PersistedColumn
    GO
    
    -- Delete the persisted column
    ALTER TABLE MyTable
       DROP COLUMN PersistedColumn
    GO
    
    -- Rename new column to old name
    EXEC sp_rename 'MyTable.newColumn', 'PersistedColumn', 'COLUMN'
    GO
    

    【讨论】:

    • 我需要保留栏目名称。
    • 然后在使用 EXEC sp_rename 'newColumn', 'PersistedColumn', 'COLUMN' 删除 PersistedColumn 后进行重命名
    【解决方案2】:

    发帖人想保留栏目名称。我在 Mitch 的代码末尾添加了一行以在删除 PersistedColumn 后进行重命名

    -- Create a new Column (unpersisted):
    ALTER TABLE MyTable
       ADD newColumn DatatypeOfPersistedColumn
    
    UPDATE myTable
    SET newColumn = PersistedColumn
    
    -- Delete the persisted column
    ALTER TABLE MyTable
       DROP COLUMN PersistedColumn
    
    -- Rename the new column to the old name
    EXEC sp_rename 'MyTable.newColumn', 'PersistedColumn', 'COLUMN'
    

    【讨论】:

      【解决方案3】:

      @Mitch Wheat 的解决方案效果很好。但是,有时这会引发“无效列名:newColumn”的错误,因为表在尝试运行更新之前尚未更新。

      要解决此问题,请添加 GO 语句将两者分成批次:

      -- Create a new Column (unpersisted):
      ALTER TABLE MyTable
         ADD newColumn DatatypeOfPersistedColumn
      
      GO
      
      UPDATE myTable
      SET newColumn = PersistedColumn
      
      -- Delete the persisted column
      ALTER TABLE MyTable
         DROP COLUMN PersistedColumn
      
      -- Rename new column to old name
      EXEC sp_rename 'MyTable.newColumn', 'PersistedColumn', 'COLUMN'
      

      【讨论】:

        【解决方案4】:

        假设将计算列转换为“真实”列的原因是您希望保留现有值/功能,但在需要时添加覆盖它的能力,您可以添加一个新列(待填充仅在要覆盖现有派生值的情况下),并将计算列的定义更改为 COALESCE(NewColumn, 旧计算定义 )

        【讨论】:

          【解决方案5】:

          只需在 SSMS 中表格的设计模式中从“计算列规范”中删除公式即可。值将按原样保留在列中。

          【讨论】:

          • 这种方式管理工作室实际上重新创建表,并重新插入值。这是一个生产中的大型数据库,所以它不适合我。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多