使用数据定义语言删除列和所有依赖对象

时间:2010-12-16 16:58:21

标签: sql sql-server tsql ddl

我需要从表中删除一列,但是当我尝试删除它时:

  

对象'object_name'是依赖的   在列'column_name'上。

     

ALTER TABLE DROP COLUMN column_name失败,因为   一个或多个对象访问它   列。

我可以在系统表中查找依赖项并手动删除它,但我需要进行迁移(使用SQL DDL),以便团队中的所有其他成员只进行更新,运行迁移和不必弄乱系统对象。

1 个答案:

答案 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)