为什么SQL Server不断创建DF约束?

为什么SQL Server不断创建DF约束?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试用SQL创建升级和备份脚本。升级脚本添加了如下列: 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.

我正在尝试用SQL创建升级和备份脚本。升级脚本添加了如下列:

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
回退脚本删除列,如下所示:

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停止创建此随机命名的约束,或者我需要能够使用通配符删除脚本中的约束,因为名称已更改。

这是由于新添加列中的
默认值(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
运行以下命令:

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

如果要删除约束,请运行以下命令:

DECLARE @tableName NVARCHAR(255) = '[INSERT]';
DECLARE @first5CharsFromColumnName NVARCHAR(255) = '[INSERT]';
DECLARE @name NVARCHAR(255);
SELECT @name = d.name FROM dbo.sysobjects d
INNER JOIN dbo.sysobjects t ON t.id = d.parent_obj
WHERE d.name LIKE '%'+@first5CharsFromColumnName+'%' AND d.type = 'D' AND t.name = @tableName

IF @name IS NOT NULL BEGIN
    EXEC('ALTER TABLE '+@tableName+' DROP CONSTRAINT ' + @name);
END

谢谢你,马丁。另外,为了正确地检查约束是否存在(在删除它之前),我使用了@lvaroG.Vicario-yes描述的方法。马丁的回答给了你一个例子。