为什么SQL Server不断创建DF约束?
我正在尝试用SQL创建升级和备份脚本。升级脚本添加了如下列:为什么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.
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描述的方法。马丁的回答给了你一个例子。