2009-04-20 82 views

回答

7

一个解决方案from a search:(编辑为默认约束)

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 
+0

将OBJECT_NAME更改为PARENT_OBJECT_NAME效果不错。 – 2009-04-22 08:24:30

+0

好的查询。我会尽量纠正。游标的声明应该是:SELECT NAME,parent_object_id FROM SYS.OBJECTS WHERE TYPE ='D'AND parent_object_id = OBJECT_ID('Mytable') – 2013-04-10 08:50:28

0

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

4

我知道这是旧的,但我在Google上搜索时发现它。 对我来说,2008年的SQL(不知道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