2010-09-09 139 views
4

如果您在SQL Server中刪除了一個包含Keys,Indexes,Contraints等的表,它是否也會刪除這些表?我只是想知道,如果我需要爲所有這些創建刪除腳本,或者如果我可以簡單地刪除這些表,我何時構建腳本?SQL Server刪除表

感謝,

小號

回答

8

是的,雖然你不能刪除由另一個表的外鍵引用的表。

這裏有一個程序丟棄與引用它的SQL Server 2008中的外鍵的表:

create table TA (AID int identity(1, 1), OtherId int, Name varchar(512), constraint PK_TA primary key (AID)) 
create table TB (BID int identity(1, 1), OtherId int, Name varchar(512), constraint PK_TB primary key (BID)) 
alter table TA add constraint FK_TA_TB foreign key (OtherId) references TB (BID) 
alter table TB add constraint FK_TB_TA foreign key (OtherId) references TA (AID) 

drop table ta -- doesn't work 
drop table tb -- doesn't work 

create procedure my_DropTable @tableName varchar(512) as 
begin 
    if OBJECT_ID(@tableName) is null begin print 'OBJECT DOES NOT EXIST' return end 
    declare @sql nvarchar(max) 
    while exists (select * from sys.foreign_keys where referenced_object_id = object_id(@tableName)) 
    begin 
     select @sql = 'ALTER TABLE ' + OBJECT_NAME(parent_object_id) + ' DROP CONSTRAINT ' + OBJECT_NAME(object_id) 
     from sys.foreign_keys where referenced_object_id = object_id(@tableName) 

     exec sp_executesql @sql 
    end 
    set @sql = 'DROP TABLE ' + @tableName 
    exec sp_executesql @sql 
end 

exec my_DropTable 'TA' 
exec my_DropTable 'TB' 
+0

的確如此,如果你正在編寫一個腳本,例如放下一切,你需要做的是在這樣的你首先刪除引用其他表格的方法。 – bjorsig 2010-09-09 22:07:45

+0

是的,感謝gusy – scarpacci 2010-09-09 22:09:18

+0

@bjorsig:除非你有循環引用,這在我的經驗並不常見。 – 2010-09-10 00:28:20