回答

收藏

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

技术问答 技术问答 243 人阅读 | 0 人回复 | 2023-09-14

我需要从表中删除列,但当我试图删除它时:' [5 G  ^# Z8 o" m
对象“ object_name column_name”。/ d* R9 f  Q8 q( X; m1 d0 R, d& Q
ALTER TABLE DROP COLUMN column_name失败,因为一个或多个对象访问这个列。" ?& _7 \! m& E
我可以在系统表中找到依赖关系并手动删除,但我需要迁移(使用)SQL
: ^. ~) }4 N) `8 }9 ]0 A, p7 }DDL),因此,团队中的所有其他成员只需要更新和迁移,就不必搞砸。系统对象。; L; ^  h# t0 j9 ~9 c
                                                                0 w* c5 e. y7 ]
    解决方案:                                                                0 ]3 x5 D1 G8 M. e
                                                                尝试以下代码:
& Y& c5 W9 A9 _& [) ~  JDeclare @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:# H/ P* T! i& ]$ i( S
ALTER TABLE YOURTABLENAMEDROP COLUMN YOURCOLUMNNAME使用第一个代码,您可以删除该列上的所有依赖项,然后可以毫无问题地删除它。
" r0 H! f/ l7 T! C8 q编辑-删除默认值约束:
0 l* Q/ r8 B* E0 S6 U上面的代码似乎没有被删除DEFAULT_CONSTRAINTS,因此,在这种情况下,您还必须使用它:
3 F* [! C" P; k: yDECLARE @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)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则