aGu*_*Guy 5 sql t-sql sql-server ddl
我需要从表中删除一列,但当我尝试删除它时:
对象'object_name'依赖于列'column_name'.
ALTER TABLE DROP COLUMN column_name失败,因为一个或多个对象访问此列.
我可以在系统表中查找依赖项并手动删除它,但我需要进行迁移(使用SQL DDL),以便团队中的所有其他成员只进行更新,运行迁移而不必陷入困境系统对象.
JOB*_*OBG 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)
Run Code Online (Sandbox Code Playgroud)
然后运行常规的alter table:
ALTER TABLE YOURTABLENAME
DROP COLUMN YOURCOLUMNNAME
Run Code Online (Sandbox Code Playgroud)
使用第一个代码,您删除该列上的所有依赖项,然后您可以毫无问题地删除它.
编辑 - 删除默认值约束:
上面的代码似乎没有删除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)
Run Code Online (Sandbox Code Playgroud)