2011-10-05 21 views
28

SQL'de yükseltme ve geri alma komut dosyaları oluşturmaya çalışıyorum.SQL Server neden bir DF kısıtlaması oluşturmaya devam ediyor?

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) 

backout komut şöyle sütunu kaldırır: yükseltme komut bir sütun şöyle ekler

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. 

biliyorum: Ancak

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

ALTER TABLE TableName 
    DROP COLUMN ColumnName 

, backout komut bu hatayı atar Kısıtlama nasıl bırakılır, ancak kısıtlamanın adı her zaman değişir (sonek değişir). Bu rasgele adlandırılmış kısıtlamayı oluşturmayı durdurmak için SQL Server'a ihtiyacım var VEYA isim değiştirdiğinden, joker karakterleri kullanarak betiğimde kısıtlamayı kaldırabilmem gerekiyor.

cevap

58

Bu, yeni eklediğiniz sütunda DEFAULT(0) nedeniyle eklenen default kısıtlamasıdır.

Kendiniz, otomatik ad oluşturma işlemine güvenmek yerine, bilinen bir sabit ada sahip olacak şekilde bunu kendiniz belirleyebilirsiniz.

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

Sonra Sütunu kaldırmak için ve birlikte

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

+1. –

+0

Teşekkürler Martin. Ayrıca, kısıtlamanın mevcut olup olmadığını doğru bir şekilde kontrol etmek için (düşmeden önce), ** [burada] açıklanan yöntemi kullandım (http://stackoverflow.com/questions/2499332/how-to-check-if-a-constraint- var-in-sql-sunucu/6839547 # 6839547) ** – WEFX

+0

@ ÁlvaroG.Vicario - evet. Martin'in cevabı size bir örnek veriyor. –

0

çalıştır bu sınırlandırılmasına: genellikle açıkça kısıtlamaları isim önerilir

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 
İlgili konular