sp_depends
显示有关数据库对象相关性的信息(例如,依赖表或视图的视图和过程,以及视图或过程所依赖的表和视图)。不报告对当前数据库以外对象的引用。语法
sp_depends [ @objname = ] 'object' 

解决方案 »

  1.   

    约束是自动生成的,比如用如下命令,sqlserver会自动生成约束:
    alter table test add int_test int not null default 12
    即向表中添加一个不为空,缺省值为12的名叫int_test的int字段
    系统会自动生成一个约束,名字是DF_test_int_test,但有时约束名是:DF__test__int_test__66B53B20什么的,我不知道后面的66B53B20是怎么来的,呵呵。另外,我试了,在显示相关性,或sp_depends [ @objname = ] 'object' 都找不到,还有其他办法吗?
      

  2.   

    假设该字段只有一个约束,可以这么删除:declare @consname as varchar(50)
    select @consname=name from sysobjects where name like '%abc_bb%'
    exec('alter table abc drop constraint ' + @consname)如果存在多个约束,可以用一个循环来删除,直到查询的约束名为NULL。
      

  3.   

    怎么循环?如果该表有这样两个字段ss,ssss,那么如果我要删除ss列,可能先把ssss列的约束删掉了......
      

  4.   

    是,没有完全考虑清楚。
    不过可以在查询上作文章,比如用parent_id字段等,具体语句现在没时间写,晚上再说吧。
      

  5.   

    其实不用那么复杂,也可以这样
    select @consname=name from sysobjects where name like '%_abc_bb'
    or name like '%_abc_bb_%'
      

  6.   

    declare @consname as varchar(50)
    set @consname=''
    select '1'
    while @@rowcount >0
    begin
    select @consname=name from sysobjects where name like '%_abc_bb' or name like '%_abc_bb_%'
    if @@rowcount>0 
    exec('alter table abc drop constraint ' + @consname)
    end
      

  7.   

    真的很正确,再问一下:
    select '1' 有什么用??另外:在select @consname=name from sysobjects where name like '%_abc_bb' or name like '%_abc_bb_%'
    中,由于列名是变化的,所以想使用变量,在这里怎么使用?如:
    declare @ColName varchar(50)
    declare @TabName varchar(50)
    set @TabName='test'
    set @ColName='column1'
    在select语句中怎么把这两个变量写进去??
    用exec("select @consname=name from sysobjects where name like '%_"+@TabName+"_"+@ColName+"' or name like '%_"+@TabName+"_"+@ColName+"_%')这种写法对吗,好象运行结果是没有反应,该怎么写??真不好意思,我第一次写存储过程,是菜鸟中的菜鸟
      

  8.   

    select  * from sysobjects where xtype='D'
    语句可以察看所有的约束名称
      

  9.   

    declare @consname as varchar(50)
    declare @ColName varchar(50)
    declare @TabName varchar(50)
    set @TabName='abc'
    set @ColName='bb'
    set @consname=''
    while @@rowcount >0
    begin
    select @consname=name from sysobjects where name like '%_'+@TabName+'_'+@ColName 
    or name like '%_'+@TabName+'_'+@ColName +'_%'
    if @@rowcount>0 
    exec('alter table '+@TabName +' drop constraint ' + @consname)
    end
    其中select '1'只是给@@rowcount取个值,可以不要。
      

  10.   

    打包成存储过程最好了
    create procedure DelCol
    @TabName varchar(50),
    @ColName varchar(50)
    asdeclare @consname as varchar(50)
    set @consname=''
    while @@rowcount >0
    begin
    select @consname=name from sysobjects where name like '%_'+@TabName+'_'+@ColName 
    or name like '%_'+@TabName+'_'+@ColName +'_%'
    if @@rowcount>0 
    exec('alter table '+@TabName +' drop constraint ' + @consname)
    end
    exec('alter table ' +@TabName +' drop column ' + @ColName)
    go
    调用示例:
    exec DelCol 'abc','bb'
      

  11.   

    谢谢!经试验,完全正确,呵呵,怎么给分你?我不会啊,可否留个qq给我?我将它改了一下,因为用程序创建的约束,sqlserver生成的约束名称是这样的DF__table__column__*****,用管理器创建的约束是 DF_table_column,呵呵create procedure DelCol
    @TabName varchar(50),
    @ColName varchar(50)
    asdeclare @consname as varchar(50)
    set @consname=''
    while @@rowcount >0
    begin
    select @consname=name from sysobjects where name like '%_'+@TabName+'_'+@ColName 
    or name like '%_'+@TabName+'_'+@ColName +'_%'
                    or name like '%__'+@TabName+'__'+@ColName 
    or name like '%__'+@TabName+'__'+@ColName +'__%'
    if @@rowcount>0 
    exec('alter table '+@TabName +' drop constraint ' + @consname)
    end
    exec('alter table ' +@TabName +' drop column ' + @ColName)