2008-08-07 40 views
116

Tôi muốn một tập lệnh thả tất cả các bảng có tên bắt đầu bằng một chuỗi nhất định. Tôi chắc rằng điều này có thể được thực hiện với một số sql động và các bảng INFORMATION_SCHEMA.Thả tất cả các bảng có tên bắt đầu bằng một chuỗi nhất định

Nếu có ai đó có tập lệnh hoặc có thể gõ nhanh lên, vui lòng đăng lên.

Nếu không ai đăng câu trả lời trước khi tôi tự tìm ra, tôi sẽ đăng giải pháp của mình.

Trả lời

120

Bạn có thể cần phải sửa đổi truy vấn để bao gồm chủ sở hữu nếu có nhiều hơn một trong cơ sở dữ liệu.

DECLARE @cmd varchar(4000) 
DECLARE cmds CURSOR FOR 
SELECT 'drop table [' + Table_Name + ']' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE Table_Name LIKE 'prefix%' 

OPEN cmds 
WHILE 1 = 1 
BEGIN 
    FETCH cmds INTO @cmd 
    IF @@fetch_status != 0 BREAK 
    EXEC(@cmd) 
END 
CLOSE cmds; 
DEALLOCATE cmds 

Điều này rõ ràng hơn là sử dụng cách tiếp cận hai bước tạo tập lệnh và chạy. Nhưng một lợi thế của việc tạo kịch bản là nó cho bạn cơ hội để xem xét toàn bộ những gì sẽ được chạy trước khi nó thực sự chạy.

Tôi biết rằng nếu tôi định thực hiện điều này đối với cơ sở dữ liệu sản xuất, tôi sẽ cẩn thận hết mức có thể.

Chỉnh sửa Cố định mẫu mã.

+4

Bạn có thể phải chạy tập lệnh này nhiều lần vì các ràng buộc khóa ngoài giữa bảng chính và bảng chi tiết. –

+7

Trong SQL Server 2005, tôi đã phải thay đổi hai dòng cuối thành 'close cmds; deallocate cmds'. –

+0

* Cảnh báo *: Giải pháp này cũng có thể xóa bảng do SQL Server tạo! Giải pháp của tôi dưới đây tránh điều này và xóa bảng theo thứ tự phụ thuộc chính của nước ngoài. –

95
SELECT 'DROP TABLE "' + TABLE_NAME + '"' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%' 

Điều này sẽ tạo ra tập lệnh.

Thêm khoản để kiểm tra sự tồn tại của bảng trước khi xóa:

câu trả lời
SELECT 'IF OBJECT_ID(''' +TABLE_NAME + ''') IS NOT NULL BEGIN DROP TABLE [' + TABLE_NAME + '] END;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%' 
+9

tôi có thể thêm vào để loại bỏ các dấu ngoặc khi thay thế "tiền tố" với tiền tố mục tiêu của bạn. – Levitikon

+6

MYSQL: SELECT concat ('DROP TABLE', TABLE_NAME, ";") dưới dạng dữ liệu FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '[prefix]%' --- cho những người thích tôi tìm thấy chuỗi này – Andre

+1

Kết quả cũng chứa – Ondra

3

Xenph Yan 's là xa sạch hơn tôi nhưng đây là của tôi tất cả như nhau.

DECLARE @startStr AS Varchar (20) 
SET @startStr = 'tableName' 

DECLARE @startStrLen AS int 
SELECT @startStrLen = LEN(@startStr) 

SELECT 'DROP TABLE ' + name FROM sysobjects 
WHERE type = 'U' AND LEFT(name, @startStrLen) = @startStr 

Chỉ cần thay đổi tableName thành ký tự mà bạn muốn tìm kiếm.

0

Cảm ơn Curt, đó là cùng một loại giải pháp mà tôi đang ở giữa bản thân mình.

Bạn đẹp hơn tôi mặc dù nó tự sửa đổi dễ dàng. Tôi đã thêm một liên minh để lựa chọn và tiêu diệt một số quan điểm cũng;)

declare @cmd varchar(4000) 
declare cmds cursor for 
Select 'drop table [' + Table_Name + ']' 
From INFORMATION_SCHEMA.TABLES 
Where Table_Name like 'prefix%' 
union 
Select 'drop view [' + Table_Name + ']' 
From INFORMATION_SCHEMA.VIEWS 
Where Table_Name like 'prefix%' 
open cmds 
while 1=1 
begin 
    fetch cmds into @cmd 
    if @@fetch_status != 0 break 
    exec(@cmd) 
end 
close local 
deallocate local 

Đừng lo lắng, nó không phải là một cơ sở dữ liệu sản xuất - điều này chỉ là để dễ dàng dọn dẹp của dev của tôi db trong khi tôi cố gắng thứ ngoài.

4
CREATE PROCEDURE usp_GenerateDROP 
    @Pattern AS varchar(255) 
    ,@PrintQuery AS bit 
    ,@ExecQuery AS bit 
AS 
BEGIN 
    DECLARE @sql AS varchar(max) 

    SELECT @sql = COALESCE(@sql, '') + 'DROP TABLE [' + TABLE_NAME + ']' + CHAR(13) + CHAR(10) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME LIKE @Pattern 

    IF @PrintQuery = 1 PRINT @sql 
    IF @ExecQuery = 1 EXEC (@sql) 
END 
0
select 'DROP TABLE ' + name from sysobjects 
where type = 'U' and sysobjects.name like '%test%' 

- Kiểm tra là tên bảng

+1

Còn FK thì sao? – user3104183

+0

điều này không thực sự thực hiện bất cứ điều gì, chỉ cần trả lại một loạt các lệnh. –

14

Điều này sẽ giúp bạn có được bảng theo thứ tự quan trọng nước ngoài và tránh thả một số các bảng được tạo ra bởi SQL Server. Giá trị t.Ordinal sẽ chia các bảng thành các lớp phụ thuộc.

WITH TablesCTE(SchemaName, TableName, TableID, Ordinal) AS 
(
    SELECT OBJECT_SCHEMA_NAME(so.object_id) AS SchemaName, 
     OBJECT_NAME(so.object_id) AS TableName, 
     so.object_id AS TableID, 
     0 AS Ordinal 
    FROM sys.objects AS so 
    WHERE so.type = 'U' 
     AND so.is_ms_Shipped = 0 
     AND OBJECT_NAME(so.object_id) 
     LIKE 'MyPrefix%' 

    UNION ALL 
    SELECT OBJECT_SCHEMA_NAME(so.object_id) AS SchemaName, 
     OBJECT_NAME(so.object_id) AS TableName, 
     so.object_id AS TableID, 
     tt.Ordinal + 1 AS Ordinal 
    FROM sys.objects AS so 
     INNER JOIN sys.foreign_keys AS f 
      ON f.parent_object_id = so.object_id 
       AND f.parent_object_id != f.referenced_object_id 
     INNER JOIN TablesCTE AS tt 
      ON f.referenced_object_id = tt.TableID 
    WHERE so.type = 'U' 
     AND so.is_ms_Shipped = 0 
     AND OBJECT_NAME(so.object_id) 
     LIKE 'MyPrefix%' 
) 
SELECT DISTINCT t.Ordinal, t.SchemaName, t.TableName, t.TableID 
FROM TablesCTE AS t 
    INNER JOIN 
    (
     SELECT 
      itt.SchemaName AS SchemaName, 
      itt.TableName AS TableName, 
      itt.TableID AS TableID, 
      Max(itt.Ordinal) AS Ordinal 
     FROM TablesCTE AS itt 
     GROUP BY itt.SchemaName, itt.TableName, itt.TableID 
    ) AS tt 
     ON t.TableID = tt.TableID 
      AND t.Ordinal = tt.Ordinal 
ORDER BY t.Ordinal DESC, t.TableName ASC 
+0

Nhờ http://stackoverflow.com/questions/352176/sqlserver-how-to-sort-table-names-ordered-by-their-foreign-key-dependency –

+3

Sửa nhanh: TableName xuất hiện một vài lần trong mệnh đề WHERE và phải được thay thế bằng OBJECT_NAME (so.object_id). Kịch bản hay! – witttness

0
SELECT 'if object_id(''' + TABLE_NAME + ''') is not null begin drop table "' + TABLE_NAME + '" end;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%' 
0

tôi phải làm một derivation nhẹ về câu trả lời Xenph Yan của tôi nghi ngờ vì tôi đã có bảng không trong lược đồ mặc định.

SELECT 'DROP TABLE Databasename.schema.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'strmatch%' 
4

On Oracle XE công trình này:

SELECT 'DROP TABLE "' || TABLE_NAME || '";' 
FROM USER_TABLES 
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%' 

Hoặc nếu bạn muốn loại bỏ những hạn chế và giải phóng không gian là tốt, sử dụng này:

SELECT 'DROP TABLE "' || TABLE_NAME || '" cascade constraints PURGE;' 
FROM USER_TABLES 
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%' 

nào sẽ tạo ra một loạt các câu hỏi DROP TABLE cascade constraints PURGE ...

VIEWS sử dụng này:

SELECT 'DROP VIEW "' || VIEW_NAME || '";' 
FROM USER_VIEWS 
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%' 
4

Tôi thấy bài này khi tôi đang tìm kiếm tuyên bố mysql để thả tất cả các bảng WordPress dựa trên @Xenph Yan đây là những gì tôi đã làm cuối cùng:

SELECT CONCAT( 'DROP TABLE `', TABLE_NAME, '`;') AS query 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'wp_%' 

chí này cung cấp cho bạn các thiết lập của các truy vấn thả cho tất cả các bảng bắt đầu với wp_

2

đây là giải pháp của tôi:

SELECT CONCAT('DROP TABLE `', TABLE_NAME,'`;') 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'TABLE_PREFIX_GOES_HERE%'; 

Và tất nhiên bạn cần thay thế TABLE_PREFIX_GOES_HERE bằng tiền tố của mình.

4
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?' 

Edit:

sp_MSforeachtable là không có giấy tờ do đó không thích hợp cho sản xuất vì đó là hành vi có thể thay đổi tùy thuộc vào phiên bản MS_SQL.

+0

Tuyệt vời một lớp lót! Điều này nên được bình chọn ở đầu trang. – user3413723

0

Trong trường hợp các bảng tạm thời, bạn có thể muốn thử

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t 
WHERE t.name LIKE '[prefix]%' 
Các vấn đề liên quan