我需要更改SQL Server中现有计算列的计算逻辑。
我希望保持列名不变。
我写了一个脚本来完成这项工作。而剧本
问题是这个脚本将来可能会运行多次,但我不希望每次都删除此脚本并创建列。
是否有某种方法可以避免多次删除和创建此列?
我能想到的一种方法是创建一个虚拟检查约束。 因此,在删除并重新创建计算列之前,首先检查是否存在虚拟检查约束。
如果它不存在,则创建虚拟约束并删除/创建计算列。
不确定是否还有其他简单方法可以解决此问题。
答案 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