2011-02-01 72 views
18

在Oracle中,放棄你輸入一些東西的所有表和約束像SQL Server:刪除表級聯等效?

DROP TABLE myTable CASCADE CONSTRAINTS PURGE; 

,這將完全刪除的表和它們的依賴關係。什麼是SQL服務器等效?

+0

回答於:http://stackoverflow.com/questions/2247268/t-sql-drop-table-cascade-constraints-equivalent – rizzle 2011-03-30 15:44:51

回答

22

我不相信SQL有一個類似的優雅的解決方案。您必須首先刪除任何相關約束,然後才能刪除表。

幸運的是,這些都存儲在信息模式中,您可以訪問它來獲取您的重擊列表。

本博客文章應該能夠得到你需要的東西: http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx

-- t-sql scriptlet to drop all constraints on a table 
DECLARE @database nvarchar(50) 
DECLARE @table nvarchar(50) 

set @database = 'DatabaseName' 
set @table = 'TableName' 

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 
    exec sp_executesql @sql 
END 
29

在SQL Server Management Studio中,進入選項/ SQL Server的對象資源管理器/腳本,並啓用「生成腳本依賴對象。然後右鍵單擊表格,腳本>拖放到>新查詢窗口,它會爲您生成它。

+0

也可用於刪除數據庫中的所有對象。另一個ssms令人敬畏的力量的例子。救了我從sys.objects腳本編寫這個自己! – 2011-12-19 06:29:46

5

這可能是一個可怕的解決方案,但我覺得它很快。它與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>' 
) 
1

最終,我們正在刪除我們的餐桌。 因此,我們可以簡單地運行2以下命令:

ALTER TABLE ... DROP CONSTRAINT ...

DROP TABLE ...

1> ALTER TABLE PRJ_DETAILS DROP約束FK_PRJ_TYPE;

- 表名和約束名是參數

2> DROP TABLE。

首次下降的約束,其與它的表 其次,你可以刪除表相關聯的名字。

它爲我工作,也很容易。

1

這是所有的樂趣和遊戲,直到一些表引用您的表...

那我必須改變提供像這樣的代碼:

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 
0

我只需要刪除外鍵

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