8

如何删除属于 SQL 2005 中特定表的所有默认约束?

4

4 回答 4

7

搜索中的一种解决方案:(针对默认约束进行了编辑)

SET NOCOUNT ON

DECLARE  @constraintname SYSNAME, @objectid int,
           @sqlcmd         VARCHAR(1024)

DECLARE CONSTRAINTSCURSOR CURSOR  FOR
SELECT NAME, object_id
FROM   SYS.OBJECTS
WHERE  TYPE = 'D' AND @objectid = OBJECT_ID('Mytable')

OPEN CONSTRAINTSCURSOR

FETCH NEXT FROM CONSTRAINTSCURSOR
INTO @constraintname, @objectid

WHILE (@@FETCH_STATUS = 0)
BEGIN
    SELECT @sqlcmd = 'ALTER TABLE ' + OBJECT_NAME(@objectid) + ' DROP CONSTRAINT ' + @constraintname
    EXEC( @sqlcmd)
    FETCH NEXT FROM CONSTRAINTSCURSOR
    INTO @constraintname, @objectid
END

CLOSE CONSTRAINTSCURSOR
DEALLOCATE CONSTRAINTSCURSOR
于 2009-04-20T07:37:03.927 回答
4

我知道这是旧的,但我只是在谷歌搜索时发现它。下面是一个在 SQL 2008(不确定 2005 年)中对我有用的解决方案,而不使用游标:

declare @sql nvarchar(max)

set @sql = ''

select @sql = @sql + 'alter table YourTable drop constraint ' + name  + ';'
from sys.default_constraints 
where parent_object_id = object_id('YourTable')
AND type = 'D'

exec sp_executesql @sql
于 2013-03-20T00:34:35.647 回答
0

gbn 发布的脚本对我不起作用,所以我使用的是修改后的版本:

SET NOCOUNT ON

DECLARE  @DfId INT, @TableId INT,
         @SqlCmd    VARCHAR(1024)

DECLARE DFCONSTRAINTCUR CURSOR FOR
SELECT [parent_object_id] TABLE_ID, [object_id] DF_ID
FROM   SYS.OBJECTS
where parent_object_id = OBJECT_ID('<table name>') 
and [TYPE] = 'D' 

OPEN DFCONSTRAINTCUR

FETCH NEXT FROM DFCONSTRAINTCUR
INTO @TableId, @DfId

WHILE (@@FETCH_STATUS = 0)
BEGIN
    SELECT @sqlcmd = 'ALTER TABLE ' + OBJECT_NAME(@TableId) + ' DROP CONSTRAINT ' + OBJECT_NAME(@DfId)
    EXEC(@sqlcmd)
    FETCH NEXT FROM DFCONSTRAINTCUR
    INTO @TableId, @DfId
END

CLOSE DFCONSTRAINTCUR
DEALLOCATE DFCONSTRAINTCUR
于 2020-03-18T09:16:16.577 回答
-3

你为什么要这样做?删除约束是一项非常激烈的操作,不仅会影响您的流程,还会影响所有用户。也许您的问题可以通过其他方式解决。如果您不是系统的 dba,您应该非常认真地考虑是否应该这样做。(当然,在大多数系统中,dba 不会允许其他任何人拥有执行此类操作的权限。)

于 2009-04-20T14:38:16.317 回答