2017-06-02 43 views
2

我已經深入瞭解了這些以前的問題Q1,Q2,Q3。使用這個我可以捕捉我的確切約束名稱。但這對我來說還不夠。如何從多個數據庫的SQL Server數據庫中的表中刪除或更改默認約束?

例如,我已經做了財產以後

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

這裏我自動由機器命名constrant爲DF__Documents__ShowO__7AB2122C我的機器上。但是我在多臺PC上運行相同的腳本,在那些PC上,除了最後的散列值外,這些約束幾乎相同。 DF__Documents__ShowO__54A20B0DDF__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,即使我可以抓住它。那麼我怎麼能把這個名字放在這裏呢?

更新修改了問題。

+0

的mysql =(MS)SQL服務器 – Jens

回答

1

運行這一點,並輸出爲文本,然後將代碼複製的結果,而在另一個查詢窗口中運行

弗裏茨下方添加了更新約束:

;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 
+0

這是什麼名字?請說。 – gdmanandamohon

+0

已更新,其中包含您的條件 –

+0

它向我顯示一個錯誤'不明確的列名'object_id'.' – gdmanandamohon

0

在MS SQL,你可以指定約束名明確:

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

想想OP知道,但問題是他們不知道的系統生成的名稱。 –

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' [email protected] 

Exec(@variable) 
相關問題