2011-02-01 41 views
18

Trong oracle, để thả tất cả các bảng và những hạn chế bạn nên gõ cái gì đó nhưSQL Server: thả bảng xếp tầng tương đương?

DROP TABLE myTable CASCADE CONSTRAINTS PURGE; 

và điều này sẽ xóa hoàn toàn các bảng và phụ thuộc của họ. Máy chủ SQL tương đương là gì ??

+0

được trả lời tại: http://stackoverflow.com/questions/2247268/t-sql-drop-table-cascade-constraints-equivalent – rizzle

Trả lời

22

Tôi không tin rằng SQL có giải pháp thanh lịch tương tự. Bạn phải loại bỏ bất kỳ ràng buộc liên quan nào trước khi bạn có thể thả bảng.

May mắn thay, đây là tất cả được lưu trữ trong lược đồ thông tin và bạn có thể truy cập vào đó để lấy danh sách whack của bạn.

bài viết trên blog này sẽ có thể giúp bạn có được những gì bạn cần: 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

Trong SQL Server Management Studio, hãy vào Options/SQL Server Object Explorer/Scripting, và cho phép 'Tạo kịch bản cho người phụ thuộc các đối tượng'. Sau đó, nhấp chuột phải vào bảng, tập lệnh> thả xuống> cửa sổ truy vấn mới và nó sẽ tạo ra nó cho bạn.

+0

Cũng hoạt động để xóa tất cả các đối tượng trong một db. Một ví dụ khác về sức mạnh tuyệt vời của ssms. lưu tôi kịch bản này bản thân mình từ sys.objects !! –

+1

Không phải là giải pháp tốt cho OP, bây giờ tôi hiểu tại sao nó bị vô hiệu hóa theo mặc định.Bằng cách nào đó tất cả các bảng là "phụ thuộc" trên bảng 'ContactInfo' ... ugh ... –

5

Đây có thể là một giải pháp khủng khiếp, nhưng tôi thấy nó nhanh chóng. Nó tương tự như câu trả lời của Vinnie, nhưng sản phẩm của câu lệnh SQL là một loạt các câu lệnh SQL khác sẽ xóa tất cả các ràng buộc và các bảng.

(
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

Cuối cùng, chúng tôi đang xóa bảng của chúng tôi. Vì vậy, chúng tôi chỉ đơn giản là có thể chạy 2 lệnh sau:

ALTER TABLE ... thả CONSTRAINT ...

DROP TABLE ...

1> ALTER TABLE PRJ_DETAILS thả CONSTRAINT FK_PRJ_TYPE;

- Tên bảng và Tên hạn chế là tham số

2> BẢNG DROP.

Hạn chế thả đầu tiên với tên của nó được liên kết với bảng Thứ hai, bạn có thể thả bảng.

Nó làm việc cho tôi và nó cũng dễ dàng.

1

Đây là tất cả niềm vui và trò chơi cho đến khi một số bảng tham chiếu bảng của bạn ...

Sau đó, tôi phải thay đổi mã được cung cấp như sau:

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

tôi chỉ cần xóa các khóa ngoại

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 
Các vấn đề liên quan