我需要从表中删除一列,但是当我尝试删除它时:
对象'object_name'是依赖的 在列'column_name'上。
ALTER TABLE DROP COLUMN column_name失败,因为 一个或多个对象访问它 列。
我可以在系统表中查找依赖项并手动删除它,但我需要进行迁移(使用SQL DDL),以便团队中的所有其他成员只进行更新,运行迁移和不必弄乱系统对象。
答案 0 :(得分:11)
试试这段代码:
Declare @TABLENAME varchar(max), @COLUMN varchar(max)
SET @TABLENAME = 'YOURTableName'
SET @COLUMN = 'YOURColumnName'
Declare @CONSTRAINT varchar(max)
set @CONSTRAINT ='ALTER TABLE '+@TABLENAME+' DROP CONSTRAINT '
set @CONSTRAINT = @CONSTRAINT + (select SYS_OBJ.name as CONSTRAINT_NAME
from sysobjects SYS_OBJ
join syscomments SYS_COM on SYS_OBJ.id = SYS_COM.id
join sysobjects SYS_OBJx on SYS_OBJ.parent_obj = SYS_OBJx.id
join sysconstraints SYS_CON on SYS_OBJ.id = SYS_CON.constid
join syscolumns SYS_COL on SYS_OBJx.id = SYS_COL.id
and SYS_CON.colid = SYS_COL.colid
where
SYS_OBJ.uid = user_id() and SYS_OBJ.xtype = 'D'
and SYS_OBJx.name=@TABLENAME and SYS_COL.name=@COLUMN)
exec(@CONSTRAINT)
然后运行常规的alter table:
ALTER TABLE YOURTABLENAME
DROP COLUMN YOURCOLUMNNAME
使用第一个代码删除该列上的所有依赖项,然后您可以毫无问题地删除它。
编辑 - 删除默认值约束:
上面的代码似乎没有删除DEFAULT_CONSTRAINTS所以,在这种情况下你还必须使用:
DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__') AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = N'__ColumnName__' AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)