2011-10-04 38 views
7

Tôi đang sử dụng sql-server 2005. Ban đầu, với mục đích học tập, tôi đã tạo ra nhiều bảng. hiện tại tôi đang làm việc. Có bất kỳ mã hoặc truy vấn nào mà tôi có thể bỏ tất cả các bảng khỏi cơ sở dữ liệu đó, ngoại trừ một bảng hữu ích. Một cách tôi nghĩ là sao chép bảng đó vào cơ sở dữ liệu mới bằng cách sử dụng mệnh đề SELECT INTO... và thả cơ sở dữ liệu đó nhưng không biết đây có phải là cách hay để giải quyết vấn đề này không.Làm thế nào để thả tất cả các bảng từ một cơ sở dữ liệu trong máy chủ sql 2005 trong một tuyên bố ngoại trừ một bảng

+1

Nếu các bảng không phải là rất lớn tôi có lẽ chỉ cần chọn tất cả trong cửa sổ "Object Explorer Details" trong SSMS sau đó nhấn xóa. –

+0

Cảm ơn @MartinSmith đây là một cách tốt nhưng có cách nào mà tôi có thể làm điều tương tự bằng cách sử dụng báo cáo. – Manish

Trả lời

7

Nếu các bảng không lớn lắm, có lẽ tôi chỉ cần chọn tất cả chúng trong cửa sổ "Object Explorer Details" trong SSMS rồi nhấn delete.

Đối với một giải pháp chương trình bạn có thể sử dụng

EXEC sys.sp_MSforeachtable 
     N'IF OBJECT_ID(''?'') <> OBJECT_ID(''dbo.YourTableToKeep'') 
      DROP TABLE ? 
     ' 

Cả hai phương pháp có thể cần chạy lặp đi lặp lại để xóa tất cả các bảng tham gia vào các mối quan hệ FK (một bảng không thể bị xóa nếu bảng khác có FK tham khảo nó).

+3

Để xây dựng một chút về giải pháp giao diện người dùng: F7 là phím tắt chi tiết của trình khám phá đối tượng. Bạn không thể chọn nhiều đối tượng trong khung nhìn cây thám hiểm đối tượng, nhưng bạn có thể chọn nút Tables trong khung nhìn cây và nhấn F7 để hiển thị chi tiết Object Explorer. –

6

Bạn có thể sử dụng sql để tạo tất cả các vùng thả mà bạn cần. Ví dụ: truy vấn sql tiếp theo

USE [MyDatabase]; 
GO 
SELECT 
    replace(
     replace('DROP TABLE [{Schema}].[{TableName}];' 
     ,'{Schema}',TABLE_SCHEMA) 
     ,'{TableName}',TABLE_NAME) 
FROM 
    INFORMATION_SCHEMA.TABLES 
WHERE 
    TABLE_NAME NOT IN ('TableNameOne','TableNameTwo') 

và nhận kết quả thực hiện truy vấn.

Sao chép cột đầu tiên của truy vấn và dán vào cửa sổ truy vấn mới.

Nó dễ dàng nhận thấy, rằng bạn sẽ có được một danh sách các Các tuyên bố thả cho tất cả các bảng trừ 'TableNameOne' và 'TableNameTwo', ...

Im nghĩ nó rất đơn giản ...

4
/* Drop all Foreign Key constraints */ 
DECLARE @name VARCHAR(128) 
DECLARE @constraint VARCHAR(254) 
DECLARE @SQL VARCHAR(254) 

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME) 

WHILE @name is not null 
BEGIN 
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) 
    WHILE @constraint IS NOT NULL 
    BEGIN 
     SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']' 
     EXEC (@SQL) 
     PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name 
     SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) 
    END 
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME) 
END 
GO 

/* Drop all Primary Key constraints */ 
DECLARE @name VARCHAR(128) 
DECLARE @constraint VARCHAR(254) 
DECLARE @SQL VARCHAR(254) 

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME) 

WHILE @name IS NOT NULL 
BEGIN 
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) 
    WHILE @constraint is not null 
    BEGIN 
     SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']' 
     EXEC (@SQL) 
     PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name 
     SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) 
    END 
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME) 
END 
GO 

/* Drop all tables */ 
DECLARE @name VARCHAR(128) 
DECLARE @SQL VARCHAR(254) 

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name]) 

WHILE @name IS NOT NULL 
BEGIN 
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']' 
    EXEC (@SQL) 
    PRINT 'Dropped Table: ' + @name 
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name]) 
END 
GO 
+0

điều này phục vụ nó! Cảm ơn – ben

Các vấn đề liên quan