问题:
CREATE TABLE tablename( columnname VARCHAR(20) not NULL Default 0)
GO
ALTER TABLE doc DROP COLUMN columnname
GO
会出这样的错误提示
服务器: 消息 5074,级别 16,状态 1,行 1
对象 'DF__tablename__columnname__4865BE2A' 依赖于 列 'columnname'。
服务器: 消息 4922,级别 16,状态 1,行 1
ALTER TABLE DROP COLUMN columnname 失败,因为有一个或多个对象访问此列。
请问如何删除这样的列呀!!!
原因:
在SQL Server 中,如果给表的一个字段设置了默认值,就会在系统表sysobjects中生成一个默认约束。
这时如果强制去修改这个字段,当然就会出现错误。
解决:
如果你只想删除这个字段,只要先删除这个约束,在删除这个字段就可以:
(1)
declare @sql varchar(200)
set @sql = 'alter table tablename drop constraint '+ (select o.name from syscolumns c,sysobjects o where c.id = object_id('tablename') and c.name = 'columnname' and c.cdefault = o.id)
exec(@sql)
alter table tablename drop column columnname
go
(2)
sql server 中删除默认约束的通用sql脚本
在SQL Server 中,如果给表的一个字段设置了默认值,就会在系统表sysobjects中生成一个默认约束。
如果想删除这个设置了默认值的字段(假设此字段名column1),
执行“ALTER TABLE table1 DROP COLUMN column1”时就会报错:
The object 'DF__xxxxxxxxxxx' is dependent on column 'column1'.
ALTER TABLE DROP COLUMN column1failed because one or more objects access this column.
所以在删除此字段时需要先将系统表中的对应默认约束删除, 可以使用下面的脚本进行删除:
-- this script drops the default constraint which is generated by the setting of default value.
DECLARE @tablename VARCHAR(100), @columnname VARCHAR(100), @tab VARCHAR(100)
SET @tablename='CountryGroupEmailAndWaitAux'
SET @columnname='actionOfHasNoValidEmail'
declare @defname varchar(100)
declare @cmd varchar(100)
select @defname = name
FROM sysobjects so
JOIN sysconstraints sc
ON so.id = sc.constid
WHERE object_name(so.parent_obj) = @tablename
AND so.xtype = 'D'
AND sc.colid =
(SELECT colid FROM syscolumns
WHERE id = object_id(@tablename) AND
name = @columnname)
select @cmd='alter table '+ @tablename+ ' drop constraint '+ @defname
if @cmd is null print 'No default constraint to drop'
exec (@cmd)
在删除对应的默认约束后,执行:
ALTER TABLE table1 DROP COLUMN column1
即可删除字段。
(1)和(2)同理
如果你不想删除这个字段,想修改这个字段的类型,可能采取以下方法:
从错误提示我们可以看到这样一个字段“DF__tablename__columnname__4865BE2A”,这就是系统产生的一个约束名,我们可以将这个约束删除,以后在做我们想上的操作,同样适用于以上想删除字段的操作。
这个约束名我们可以通过对表产生“Sql script”的脚本中查到,然后进行以下操作
ALTER TABLE [dbo].[epcUser] DROP
CONSTRAINT [DF__tablename__columnname__4865BE2A]
Alter Table [dbo].[epcUser]
Alter Column IsPasswordChangeRequired tinyint Not Null
ALTER TABLE [dbo].[epcUser] ADD
CONSTRAINT [DF__tablename__columnname__4865BE2A] DEFAULT (1) FOR [IsPasswordChangeRequired]
OK,这样我们的问题解决了。