如何从多个数据库的SQL Server数据库中的表中删除或更改默认约束?

时间:2017-06-02 09:50:21

标签: sql-server

我已经完成了以前的问题Q1Q2Q3。使用这个我可以捕获我的确切约束名称。但这对我来说还不够。

例如我做了一些事情

ALTER TABLE dbo.Documents ADD ShowOnHandset BIT  NOT NULL DEFAULT 'FALSE' 

这里我机器上的机器名DF__Documents__ShowO__7AB2122C自动命名。但我在多台PC上运行相同的脚本,在那些PC上,除了最后一个哈希值之外,这些约束几乎相同。 DF__Documents__ShowO__54A20B0D DF__Documents__ShowO__5D5216D7

我已经看到最后8位的散列值不相似。但我需要从所有表中删除此约束,我想用

替换它们
ALTER TABLE dbo.Documents ADD ShowOnHandset BIT  NOT NULL DEFAULT ((1))  

但我无法识别确切的约束名称,那么如何使用单个脚本删除它呢?

我已经通过上述问题找到了硬编码解决方案。但我需要一个脚本来完成它。请帮我解决这个问题。

我可以使用此代码

捕获约束名称
select name from sys.objects where name like 'DF__Documents__ShowO%'

我知道如何删除它。在这里。

ALTER TABLE dbo.AppSystems DROP constraint  [constraint_name]

但我无法做到。因为即使我能抓住它,我也无法设置值constraint_name。那么我怎么能把这个名字放在这里放弃它。

更新修改了问题。

3 个答案:

答案 0 :(得分:1)

运行此项并以文本形式输出,然后复制结果并在另一个查询窗口中运行

Fritz使用下面的代码来添加更新的约束:

;With cte As (select object_id From sys.objects where name like 'DF__Documents__ShowO%')
Select 'Alter Table ' + Object_Name(df.object_id) + N' Add Constraint Default (1) For ShowOnHandset'
From sys.default_constraints As df
Join cte As c
On c.object_id = df.object_id

这会删除约束

;With cte As (select object_id From sys.objects where name like 'DF__Documents__ShowO%')
Select 'Alter Table ' + Object_Name(df.object_id) + N' Drop Constraint [' + df.Name + ']'
From sys.default_constraints As df
Join cte As c
On c.object_id = df.object_id

答案 1 :(得分:1)

尝试动态查询:

Declare @MyVariable varchar(max)
Declare @Variable varchar(max)
Set @MyVariable=(Select name from sys.objects 
                 where parent_object_id=Object_ID('Documents','U') and name like 'DF__Documents__Show%')

Set @variable='ALTER TABLE dbo.AppSystems DROP constraint' +@MyVariable

Exec(@variable)

答案 2 :(得分:0)

在MS SQL中,您可以指定约束名称explicit:

ALTER TABLE dbo.Documents ADD ShowOnHandset BIT  NOT NULL CONSTRAINT DF_Documents_ShowOnHandset DEFAULT 'FALSE'