2011-10-05 119 views
28

我想在SQL中創建升級和退出腳本。升級腳本添加一列,像這樣:爲什麼SQL Server不斷創建DF約束?

IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName' 
    AND object_id = OBJECT_ID(N'[dbo].[TableName]')) 

ALTER TABLE TableName 
    ADD ColumnName bit NOT NULL DEFAULT(0) 

回退腳本刪除像這樣的列:

IF EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName' 
    AND object_id = OBJECT_ID(N'[dbo].[TableName]')) 

ALTER TABLE TableName 
    DROP COLUMN ColumnName 

然而,回退腳本引發此錯誤:

Msg 5074, Level 16, State 1, Line 5 
    The object 'DF__TableName__ColumnName__1BF3D5BD' is dependent on column 'ColumnName'. 
Msg 4922, Level 16, State 9, Line 5 
    ALTER TABLE DROP COLUMN ColumnName failed because one or more objects access this column. 

我知道如何刪除約束,但約束的名稱每次都會更改(後綴更改)。我需要SQL Server停止創建這個隨機命名的約束,或者我需要能夠使用通配符刪除腳本中的約束,因爲名稱會更改。

回答

58

這是default約束,因爲新添加的列中的DEFAULT(0)而被添加。

你可以自己命名,所以它有一個已知的固定名稱,而不是依靠自動生成名稱。

ALTER TABLE TableName 
    ADD ColumnName bit NOT NULL CONSTRAINT DF_Some_Fixed_Name DEFAULT(0) 

然後刪除列和約束在一起

ALTER TABLE dbo.TableName 
DROP CONSTRAINT DF_Some_Fixed_Name, COLUMN ColumnName 
+2

+1,通常建議明確命名的約束。 –

+0

謝謝馬丁。此外,要正確檢查約束是否存在(在刪除之前),我使用了描述的方法** [here](http://stackoverflow.com/questions/2499332/how-to-check-if-a-constraint- exists-in-sql-server/6839547#6839547)** – WEFX

+0

@ÁlvaroG.Vicario - 是的。馬丁的回答給了你一個例子。 –

0

運行以下命令:

declare @name as nvarchar(255); 
SELECT @name = name FROM dbo.sysobjects 
WHERE name like 'DF__XXX__YYY__%' and type = 'D' 

IF @name is not null BEGIN 
    EXEC('ALTER TABLE XXX] DROP CONSTRAINT ' + @name); 
END