Sql server 如何删除表上的所有默认约束

Sql server 如何删除表上的所有默认约束,sql-server,sql-server-2005,constraints,Sql Server,Sql Server 2005,Constraints,如何删除SQL 2005中属于特定表的所有默认约束?一个解决方案:(针对默认约束编辑) 你为什么要这么做?删除约束是一个非常激烈的行为,它影响到所有用户,而不仅仅是您的流程。也许你的问题可以用其他方法解决。如果您不是系统的dba,您应该认真考虑是否应该这样做。(当然,在大多数系统中,dba不允许任何其他人有权限做这样的事情。)我知道这很旧,但我只是在谷歌搜索时发现的。 下面是一个在SQL 2008(不确定是否为2005年)中不使用游标的解决方案: declare @sql nvarchar(ma

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

一个解决方案:(针对默认约束编辑)


你为什么要这么做?删除约束是一个非常激烈的行为,它影响到所有用户,而不仅仅是您的流程。也许你的问题可以用其他方法解决。如果您不是系统的dba,您应该认真考虑是否应该这样做。(当然,在大多数系统中,dba不允许任何其他人有权限做这样的事情。)

我知道这很旧,但我只是在谷歌搜索时发现的。 下面是一个在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

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
将NOCOUNT设置为ON
声明@DfId INT、@TableId INT、,
@SqlCmd VARCHAR(1024)
声明的DFCONSTRAINTCUR游标
选择[parent\u object\u id]TABLE\u id、[object\u id]DF\u id
从SYS.OBJECTS
其中父对象id=对象id(“”)
和[类型]=“D”
开放式DFTCUR
从DFCONSTRAINTCUR获取下一个
进入@TableId,@DfId
而(@@FETCH\u STATUS=0)
开始
选择@sqlcmd='ALTER TABLE'+对象名称(@TableId)+'DROP CONSTRAINT'+对象名称(@DfId)
EXEC(@sqlcmd)
从DFCONSTRAINTCUR获取下一个
进入@TableId,@DfId
结束
关闭DFTCUR
解除分配DFTCUR

我已经删除了我的答案,因为我不能100%确定,也无法进行测试。您自己的解决方案似乎还可以。呃,不可以?我正在使用几个需要支持Unicode的字段,我找不到任何其他方法。因此,我正在更改列的数据类型,并在过程中删除约束并再次创建它们……据我所知,这不是一个答案。更多的警告,最好是通过注释的方式给出?将OBJECT_NAME更改为PARENT_OBJECT_NAME比x更有效。查询很好。不过我还是要更正一下。游标的声明应该是:从SYS.OBJECTS中选择NAME、parent\u object\u id,其中TYPE='D'和parent\u object\u id=object\u id('Mytable')。这只会删除第一个找到的约束(至少它对我是这样做的)。您必须遍历所有这些内容。@Ioana Marcu:在SQL 2008数据库中为我工作。对于名为“Account”的表,我得到了一个类似于下面的字符串alter table Account drop constraint DF______Account_u4865be2a;alter table Account drop constraint DF_________4959E263,即一组串联的dropstatements@IoanaMarcuselect语句将它们全部迭代并合并到一个stirng中。这不会回答所提出的问题
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