SQL Server:删除表级联等效项?

SQL Server:删除表级联等效项?,sql,sql-server,cascade,database-table,sql-drop,Sql,Sql Server,Cascade,Database Table,Sql Drop,在oracle中,要删除所有表和约束,请键入以下内容 DROP TABLE myTable CASCADE CONSTRAINTS PURGE; 这将完全删除这些表及其依赖项。SQL server的等价物是什么?我认为SQL没有类似的优雅解决方案。必须先删除任何相关约束,然后才能删除表 幸运的是,这些信息都存储在信息模式中,您可以访问这些信息来获取打击列表 这篇博文应该能够满足您的需求: 在SQL Server Management Studio中,转到选项/SQL Server对象资源管理

在oracle中,要删除所有表和约束,请键入以下内容

DROP TABLE myTable CASCADE CONSTRAINTS PURGE;

这将完全删除这些表及其依赖项。SQL server的等价物是什么?

我认为SQL没有类似的优雅解决方案。必须先删除任何相关约束,然后才能删除表

幸运的是,这些信息都存储在信息模式中,您可以访问这些信息来获取打击列表

这篇博文应该能够满足您的需求:


在SQL Server Management Studio中,转到选项/SQL Server对象资源管理器/Scripting,并启用“为依赖对象生成脚本”。然后右键单击表,脚本>下拉到>新建查询窗口,它将为您生成它。

这可能是一个可怕的解决方案,但我发现它很快。这与Vinnie的答案类似,但SQL语句的产物是另一系列SQL语句,它们将删除所有约束和表

(
select
  'ALTER TABLE ' + tc.table_name + ' DROP CONSTRAINT ' + tc.constraint_name + ';'
from
  INFORMATION_SCHEMA.TABLES t
  ,INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
where
  t.table_name = tc.table_name
  and tc.constraint_name not like '%_pk'
  and tc.constraint_name not like 'pk_%'
  and t.table_catalog='<schema>'
) UNION (
select
  'DROP TABLE ' + t.table_name + ';'
from
  INFORMATION_SCHEMA.TABLES t
where
  t.table_catalog='<schema>'
)

最终我们将删除我们的表。 因此,我们可以简单地运行以下2个命令:

改变表格。。。删除约束

放下桌子

1> 更改表格PRJ_详细信息删除约束FK_PRJ_类型

-表名和约束名是参数

2> 放下桌子

第一个drop约束及其名称与表关联 第二,你们可以放下桌子


这对我很有效,也很容易

这是所有的乐趣和游戏,直到一些桌子参考了你的桌子

然后我必须修改提供的代码,如下所示:

CREATE PROCEDURE _cascadeConstraints @database nvarchar(30) = NULL, @table nvarchar(60) = NULL
as
DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
    select    @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @table
    select @sql = 'ALTER TABLE ' + tc.TABLE_NAME + ' DROP CONSTRAINT ' + tc.CONSTRAINT_NAME
      from INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc join
                  INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc on
                   (rc.CONSTRAINT_CATALOG = tc.CONSTRAINT_CATALOG and
                    rc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME) join
                  INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc_pk on
                   (tc_pk.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG and
                    tc_pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME)
     where tc.constraint_catalog = @database
       and tc_pk.TABLE_NAME = @table
    exec    sp_executesql @sql
END
go

我只需要删除外键

DECLARE @database nvarchar(50)
DECLARE @TABLE_NAME nvarchar(250)
DECLARE @CONSTRAINT_NAME nvarchar(250)
DECLARE @sql nvarchar(350)
set @database = 'XXX'


DECLARE db_cursor CURSOR FOR  
select TABLE_NAME, CONSTRAINT_NAME from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and CONSTRAINT_TYPE='FOREIGN KEY'

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME  

WHILE @@FETCH_STATUS = 0  
BEGIN  

    select    @sql = 'ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @TABLE_NAME
    exec    sp_executesql @sql 

       FETCH NEXT FROM db_cursor INTO  @TABLE_NAME, @CONSTRAINT_NAME 
END  

CLOSE db_cursor  
DEALLOCATE db_cursor 

回答:也适用于删除数据库中的所有对象。ssms强大威力的另一个例子。从sys.objects中保存了我自己编写的脚本!!不是很好的OP解决方案,现在我明白了为什么默认情况下会禁用它。不知何故,所有的表都依赖于ContactInfo表。。。呃…查询中的表名在哪里?表名存储在信息架构表中。谷歌搜索一下,我相信你会找到关于它的真正文档。谢谢,但我的意思是,如果我想删除表mytable,我应该在where子句中添加和t.table_name='mytable'?啊,问题是所有表。如果你想做一张桌子,那么你会想做不同的事情。我想单靠吊床是不行的。这意味着对其他表有约束。我建议您在问题陈述中创建一个新的SO问题,以便解决所有问题。好吧,标题是表格,但内容是表格,因此我的新问题可能会以重复的形式结束:我更喜欢您的解决方案,因为它不是脚本,我将尝试看看如何将其调整到单个表格。
DECLARE @database nvarchar(50)
DECLARE @TABLE_NAME nvarchar(250)
DECLARE @CONSTRAINT_NAME nvarchar(250)
DECLARE @sql nvarchar(350)
set @database = 'XXX'


DECLARE db_cursor CURSOR FOR  
select TABLE_NAME, CONSTRAINT_NAME from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and CONSTRAINT_TYPE='FOREIGN KEY'

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME  

WHILE @@FETCH_STATUS = 0  
BEGIN  

    select    @sql = 'ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @TABLE_NAME
    exec    sp_executesql @sql 

       FETCH NEXT FROM db_cursor INTO  @TABLE_NAME, @CONSTRAINT_NAME 
END  

CLOSE db_cursor  
DEALLOCATE db_cursor