SQL Server:如何只重建一次计算列* *

时间:2015-08-04 07:17:58

标签: sql-server sql-server-2008

我需要更改SQL Server中现有计算列的计算逻辑。

我希望保持列名不变。

我写了一个脚本来完成这项工作。而剧本

  1. 删除计算列
  2. 使用具有相同名称的新计算逻辑重新创建计算列。
  3. 问题是这个脚本将来可能会运行多次,但我不希望每次都删除此脚本并创建列。

    是否有某种方法可以避免多次删除和创建此列?

    我能想到的一种方法是创建一个虚拟检查约束。 因此,在删除并重新创建计算列之前,首先检查是否存在虚拟检查约束。

    如果它不存在,则创建虚拟约束并删除/创建计算列。

    不确定是否还有其他简单方法可以解决此问题。

2 个答案:

答案 0 :(得分:0)

您可以依赖computed_columns系统表:

SELECT  t.name
        ,SCHEMA_NAME(t.schema_id) AS [schema_name]
        ,c.name
        ,c.definition
FROM    sys.computed_columns c
        JOIN sys.tables t ON t.object_id = c.object_id;

我认为需要一些试验和错误来获取正确的代码,但您应该能够构建一个检查脚本来验证当前公式并仅在需要时触发DROP / CREATE

可能的问题:如果运行了过时的脚本版本,它可能会将公式恢复为以前的版本,因此必须执行时间戳检查。

答案 1 :(得分:0)

如果您不介意使用硬编码值(不好),这个脚本可能有所帮助。 您将不得不使用硬编码的column_id或更好地找出一种方法来检索它(可能计算此表的列数?)。

CREATE TABLE dbo.Table_1(ID int identity(0, 1), V1 int NULL, V2 int NULL, V3  AS V1*V2)  ON [PRIMARY]

select top 10 * from sys.computed_columns where OBJECT_ID('table_1') = object_id 

If Exists(Select 1 From sys.computed_columns where OBJECT_ID('table_1') = object_id and name = 'v3' and column_id<=
4)
Begin
    Print 'Update Computed Column'
    Alter TAble Table_1 Drop column V3;
    Alter Table Table_1 Add V3 as V1*V2
End
Else
Begin
    Print 'No Update'
End

select top 10 * from sys.computed_columns where OBJECT_ID('table_1') = object_id