首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有约束的SQL Server 2005删除列

带有约束的SQL Server 2005删除列
EN

Stack Overflow用户
提问于 2008-11-24 18:36:30
回答 13查看 71.6K关注 0票数 60

我有一个带有"DEFAULT“约束的列。我想创建一个删除该列的脚本。

问题是它返回以下错误:

代码语言:javascript
复制
Msg 5074, Level 16, State 1, Line 1  
The object 'DF__PeriodSce__IsClo__4BCC3ABA' is dependent on column 'IsClosed'. 
Msg 4922, Level 16, State 9, Line 1 
ALTER TABLE DROP COLUMN IsClosed failed because one or more objects access this column.

我找不到一种简单的方法来删除列及其所有相关的约束(只找到查看系统表的大脚本……必须有(!!)这是一种“很好”的方式。)

由于默认约束的名称是随机生成的,所以我不能按名称删除它。

更新

约束类型为"DEFAULT“。

我看到了你们所有人提出的解决方案,但我发现它们都很“脏”……难道你不觉得?我不知道是用Oracle还是MySQL,但可以这样做:

代码语言:javascript
复制
DROP COLUMN xxx CASCADE CONSTRAINTS 

它丢弃了所有相关的约束。或者至少它会自动删除映射到该列的约束(至少CHECK约束!)

在MSSQL中没有这样的东西吗?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2008-12-12 10:36:38

此查询查找给定表的默认约束。这不是很好,我同意:

代码语言:javascript
复制
select 
    col.name, 
    col.column_id, 
    col.default_object_id, 
    OBJECTPROPERTY(col.default_object_id, N'IsDefaultCnst') as is_defcnst, 
    dobj.name as def_name
from sys.columns col 
    left outer join sys.objects dobj 
        on dobj.object_id = col.default_object_id and dobj.type = 'D' 
where col.object_id = object_id(N'dbo.test') 
and dobj.name is not null

根据Julien N的评论编辑更新

票数 21
EN

Stack Overflow用户

发布于 2009-07-23 13:51:41

下面是一个脚本,它将删除该列及其默认约束。适当地替换MYTABLENAMEMYCOLUMNNAME

代码语言:javascript
复制
declare @constraint_name sysname, @sql nvarchar(max)

select @constraint_name = name 
from sys.default_constraints 
where parent_object_id = object_id('MYTABLENAME')
AND type = 'D'
AND parent_column_id = (
    select column_id 
    from sys.columns 
    where object_id = object_id('MYTABLENAME')
    and name = 'MYCOLUMNNAME'
    )

set @sql = N'alter table MYTABLENAME drop constraint ' + @constraint_name
exec sp_executesql @sql

alter table MYTABLENAME drop column MYCOLUMNNAME

go
票数 64
EN

Stack Overflow用户

发布于 2010-07-25 03:57:54

也许它可以提供更多的帮助:

代码语言:javascript
复制
declare @tablename nvarchar(200)
declare @colname nvarchar(200)
declare @default sysname, @sql nvarchar(max)

set @tablename = 'your table'
set @colname = 'column to drop'

select @default = name 
from sys.default_constraints 
where parent_object_id = object_id(@tablename)
AND type = 'D'
AND parent_column_id = (
    select column_id 
    from sys.columns 
    where object_id = object_id(@tablename)
    and name = @colname 
    )

set @sql = N'alter table ' + @tablename + ' drop constraint ' + @default
exec sp_executesql @sql

set @sql = N'alter table ' + @tablename + ' drop column ' + @colname
exec sp_executesql @sql

只需设置@tablename和@colname变量即可删除该列。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/314998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档