Làm cách nào để thả tất cả các bảng trong cơ sở dữ liệu SQL Server?


195

Tôi đang cố gắng viết một tập lệnh sẽ làm trống hoàn toàn cơ sở dữ liệu SQL Server. Đây là những gì tôi có cho đến nay:

USE [dbname]
GO
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DELETE ?'

Khi tôi chạy nó trong Studio quản lý, tôi nhận được:

Lệnh đã hoàn thành thành công.

nhưng khi tôi làm mới danh sách bảng, tất cả chúng vẫn ở đó. Tôi đang làm gì sai?


Nếu không có giải pháp nào trên trang này hoạt động, có lẽ bạn đã quên: SỬ DỤNG [DatabaseName] GO
Serj Sagan

2
XÓA BỎ ? sẽ xóa các hồ sơ từ bảng. Bạn nên sử dụng DROP TABLE?, Tuy nhiên điều đó sẽ không hoạt động vì những lý do khác.
datagod

Câu trả lời:


305

Nó cũng không hoạt động với tôi khi có nhiều bảng khóa ngoại.
Tôi thấy mã đó hoạt động và thực hiện mọi thứ bạn thử (xóa tất cả các bảng khỏi cơ sở dữ liệu của bạn):

DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.TABLE_SCHEMA + '].[' +  tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + '];'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME

OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql

WHILE (@@FETCH_STATUS = 0)
BEGIN
Exec sp_executesql @Sql
FETCH NEXT FROM @Cursor INTO @Sql
END

CLOSE @Cursor DEALLOCATE @Cursor
GO

EXEC sp_MSforeachtable 'DROP TABLE ?'
GO

Bạn có thể tìm thấy bài viết ở đây . Đây là bài viết của Groker.


Tại sao khi bạn cố gắng bọc toàn bộ khối mã đó trong câu lệnh IF bằng cách sử dụng khối BEGIN-END, nó sẽ phàn nàn về con trỏ?
Adam

11
Tôi đang gặp lỗiCould not find stored procedure 'sp_MSForEachTable'.
Korayem

2
Câu trả lời này không hoạt động nếu bạn có các bảng (có ràng buộc) trong một lược đồ khác với dbo. Nếu bạn có các lược đồ tùy chỉnh, bạn cần thay đổi sqlthành:SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.CONSTRAINT_SCHEMA + '].[' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + ']'
Asbjørn Ulsberg

5
sp_MSforeachtablekhông có sẵn trong Azure. Sử dụng câu trả lời của @ CountZero thay thế.
Ogglas

3
Tìm thấy tài liệu tham khảo này trên web (không phải của tôi): Bản sao thủ tục lưu trữ sp_MSforeachtable cho Azure, sử dụng sp_MSforeach_worker: gist.github.com/metaskills/893599 .
João Vieira

329

Bạn cũng có thể xóa tất cả các bảng khỏi cơ sở dữ liệu chỉ bằng các công cụ UI MSSMS (không sử dụng tập lệnh SQL). Đôi khi cách này có thể thoải mái hơn (đặc biệt nếu nó được thực hiện đôi khi)

Tôi làm điều này từng bước như sau:

  1. Chọn 'Bảng' trên cây cơ sở dữ liệu (Object Explorer)
  2. Nhấn F7 để mở giao diện Object Explorer Chi tiết
  3. Trong khung nhìn này, chọn các bảng phải được xóa (trong trường hợp này là tất cả các bảng)
  4. Tiếp tục nhấn Xóa cho đến khi tất cả các bảng đã bị xóa (bạn lặp lại số lần lỗi nhiều lần do các ràng buộc / phụ thuộc chính)

5
Tôi không thể có được sp_msforeachtable để hoạt động trên db sql Azure. Tôi đoán họ không bao gồm nó cho Azure. Giải pháp này hoạt động rất tốt và hoàn hảo khi chế giễu hoặc thực hiện nhiều thay đổi (bắt đầu lại) với việc di chuyển EF.
trevorc

Không xem xét FK / đơn hàng.
Josh

1
Đây là một phương pháp hữu ích nếu bạn chỉ cần thực hiện ở đây và ở đó, kịch bản có thể tốt hơn nếu bạn thực hiện thường xuyên.
Dylan Hayes

2
@Josh thứ tự không được xem xét nhưng nếu bạn tiếp tục nhấn Ok trong hộp thoại Xóa, nó sẽ tiếp tục xóa tất cả các bảng có thể, cuối cùng sẽ xóa tất cả các bảng.
đất sét

Giải pháp hoàn hảo sử dụng Nhà thiết kế
Zaheer

48

Trong SSMS:

  • Nhấp chuột phải vào cơ sở dữ liệu
  • Chuyển đến "Nhiệm vụ"
  • Nhấp vào "Tạo tập lệnh"
  • Trong phần "Chọn đối tượng", chọn "Tập lệnh toàn bộ cơ sở dữ liệu và tất cả các đối tượng cơ sở dữ liệu"
  • Trong phần "Đặt tùy chọn tập lệnh", nhấp vào nút "Nâng cao"
  • Trên "Script DROP and CREATE", chuyển "Script CREATE" thành "Script DROP" và nhấn OK
  • Sau đó, lưu vào tệp, bảng tạm hoặc cửa sổ truy vấn mới.
  • Chạy script.

Bây giờ, điều này sẽ bỏ mọi thứ, bao gồm cả cơ sở dữ liệu. Đảm bảo xóa mã cho các mục bạn không muốn bỏ. Ngoài ra, trong phần "Chọn đối tượng", thay vì chọn tập lệnh toàn bộ cơ sở dữ liệu, chỉ cần chọn các mục bạn muốn xóa.


3
Nếu bạn không muốn loại bỏ cơ sở dữ liệu (trong trường hợp của tôi thì tôi không cần thực hiện cuộc gọi hỗ trợ để tạo nó), sau đó sử dụng 'Chọn đối tượng cơ sở dữ liệu cụ thể' và chọn tất cả các loại đối tượng bạn muốn thả
d219

3
Đây là cách dễ dàng nhất.
Asiri Dissanayaka

2
Đây sẽ là câu trả lời cho chắc chắn!
Zac Taylor

34

deleteđược sử dụng để xóa các hàng từ một bảng. Bạn nên sử dụng drop tablethay thế.

EXEC sp_msforeachtable 'drop table [?]'

Điều đó dường như đã khắc phục vấn đề không có bất kỳ lỗi nào, nhưng bây giờ tôi đang gặp phải các lỗi ràng buộc. Là cú pháp của NOCHECK CONSTRAINTdòng của tôi sai?
dixuji

1
Tôi đã sử dụng cái này trên 2 bảng nhanh với FK và nó đã hoạt động. EXEC sp_msforeachtable 'ALTER TABLE? NOCHECK CONSTRAINT all '
DaveShaw

12
Điều này chỉ hoạt động với tôi sau khi tôi xóa dấu ngoặc vuông: EXEC sp_msforeachtable 'bảng thả?'.
LPains

Trên SQL Server, bạn cần dấu ngoặc nếu bất kỳ tên bảng nào có bất kỳ ký tự hoặc khoảng trắng lẻ nào. Tôi chưa biết phiên bản SQL Server không hỗ trợ dấu ngoặc quanh tên đối tượng.
DaveShaw

Trên SQL Server 2012 (11.x) tôi cũng phải xóa dấu ngoặc vuông.
Frieder

30

Câu trả lời được chấp nhận không hỗ trợ Azure. Nó sử dụng một thủ tục lưu trữ không có giấy tờ "sp_MSforeachtable". Nếu bạn gặp lỗi "azure không thể tìm thấy quy trình được lưu trữ 'sp_msforeachtable" khi chạy hoặc chỉ muốn tránh dựa vào các tính năng không có giấy tờ (có thể bị xóa hoặc thay đổi chức năng của chúng tại bất kỳ thời điểm nào), hãy thử dưới đây.

Phiên bản này bỏ qua bảng lịch sử di chuyển khung thực thể "__MigrationHistory" và "cơ sở dữ liệu_firewall_rules" là bảng Azure mà bạn sẽ không có quyền xóa.

Thử nghiệm nhẹ trên Azure. Hãy kiểm tra để làm điều này không có tác dụng không mong muốn đối với môi trường của bạn.

DECLARE @sql NVARCHAR(2000)

WHILE(EXISTS(SELECT 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY'))
BEGIN
    SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
    EXEC(@sql)
    PRINT @sql
END

WHILE(EXISTS(SELECT * from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_NAME != 'database_firewall_rules'))
BEGIN
    SELECT TOP 1 @sql=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_NAME != 'database_firewall_rules'
    EXEC(@sql)
    PRINT @sql
END

Được lấy từ:

https://edspencer.me.uk/2013/02/11/drop-all-tables-in-a-sql-server-database-azure-friendly/

http://www.sqlservercentral.com/bloss/sqlservertips/2011/10/11/remove-all-forign-keys/


3
Làm việc như ma thuật trên phương vị. Nhanh hơn nhiều sau đó xóa qua UI của VS
Simeon Grigorovich

27
/* 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

1
Hoạt động trong SQL Azure :) sp_MSforeachtable không hoạt động ở đó
Pavel Biryukov

Lưu ý, điều này sẽ thất bại nếu bạn có các lược đồ không phải là dbo (ví dụ: nếu bạn đang sử dụng Hangfire)
Liam Dawson

21

Bạn gần như đúng, sử dụng thay thế:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DROP TABLE ?'

nhưng dòng thứ hai bạn có thể cần phải thực thi nhiều hơn một lần cho đến khi bạn ngừng gặp lỗi:

Could not drop object 'dbo.table' because it is referenced by a FOREIGN KEY constraint.

Thông điệp:

Command(s) completed successfully.

có nghĩa là tất cả các bảng đã được xóa thành công.


17

Ngắn và ngọt:

USE YOUR_DATABASE_NAME
-- Disable all referential integrity constraints
EXEC sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

-- Drop all PKs and FKs
declare @sql nvarchar(max)
SELECT @sql = STUFF((SELECT '; ' + 'ALTER TABLE ' + Table_Name  +'  drop constraint ' + Constraint_Name  from Information_Schema.CONSTRAINT_TABLE_USAGE ORDER BY Constraint_Name FOR XML PATH('')),1,1,'')
EXECUTE (@sql)
GO

-- Drop all tables
EXEC sp_MSforeachtable 'DROP TABLE ?'
GO

2
Tôi đã phải thay thế sp_msforeachtablebằng sp_MSforeachtablevà rất khuyến khích để thêm một use yourdatabasedòng đầu tiên. Làm việc như người ở.
Simon Sobisch

Ngắn và ngọt! Thnx.
sapatelbaps

7

Cách nhịn ăn là:

  1. Sơ đồ cơ sở dữ liệu mới
  2. Thêm tất cả các bảng
  3. Ctrl + A để chọn tất cả
  4. Nhấp chuột phải vào "Xóa khỏi cơ sở dữ liệu"
  5. Ctrl + S để lưu
  6. Thưởng thức

Đây là cách nhanh nhất, ít lỗi nhất để làm điều này. Đây phải là câu trả lời được chấp nhận.
DARKGuy

6

Có vẻ như lệnh không có chăn vuông

EXEC sp_msforeachtable 'drop table ?'

6

Đối với tôi, cách dễ nhất:

--First delete all constraints

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'
ALTER TABLE ' + QUOTENAME(s.name) + N'.'
+ QUOTENAME(t.name) + N' DROP CONSTRAINT '
+ QUOTENAME(c.name) + ';'
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s 
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
ORDER BY c.[type];

EXEC sys.sp_executesql @sql;

-- Then drop all tables

exec sp_MSforeachtable 'DROP TABLE ?'

2

Tại chỗ trên!!

Bạn có thể sử dụng truy vấn bên dưới để xóa tất cả các bảng khỏi cơ sở dữ liệu

EXEC sp_MSforeachtable @ command1 = "DROP TABLE?"

Chúc mừng mã hóa!


1

Làm thế nào về việc bỏ toàn bộ cơ sở dữ liệu và sau đó tạo lại nó? Điều này làm việc cho tôi.

DROP DATABASE mydb;
CREATE DATABASE mydb;

Bạn không cần phải nổ các tập tin mdf & ldf ở giữa?
ruffin

Tôi đang sử dụng một nhà cung cấp máy chủ web và tôi không chắc chắn về điều đó. Tôi nghĩ những tệp đó sẽ tự động bị xóa khi bạn hủy cơ sở dữ liệu, trừ khi bạn ngoại tuyến.
Chong Lip Phang

2
Nó thực sự phụ thuộc vào hoàn cảnh. Trong trường hợp của tôi, tôi không có các thủ tục lưu trữ và phương pháp này hoạt động tốt với tôi. Tôi sẽ không viết các mã phức tạp kéo dài hàng chục dòng khi hai dòng sẽ làm. Tôi không nghĩ câu trả lời của mình biện minh cho một downvote vì tôi đang đưa ra một gợi ý cho một nhóm người dùng cụ thể.
Chong Lip Phang

0

Tôi biết đây là một bài viết cũ nhưng tôi đã thử tất cả các câu trả lời ở đây trên vô số cơ sở dữ liệu và đôi khi tôi thấy tất cả chúng đều hoạt động nhưng không phải lúc nào cũng cho các câu hỏi khác nhau (tôi chỉ có thể giả định) về SQL Server.

Cuối cùng tôi đã nghĩ ra cái này Tôi đã thử nghiệm điều này ở mọi nơi (nói chung) tôi có thể và nó hoạt động (không có bất kỳ thủ tục lưu trữ ẩn nào).

Đối với lưu ý chủ yếu trên SQL Server 2014. (nhưng hầu hết các phiên bản khác tôi đã thử nó dường như cũng hoạt động tốt).

Tôi đã thử trong khi các vòng lặp và null, v.v., con trỏ và nhiều dạng khác nhưng chúng dường như luôn bị lỗi trên một số cơ sở dữ liệu nhưng không phải là không có lý do rõ ràng.

Việc đếm và sử dụng số đó để lặp đi lặp lại dường như luôn hoạt động trên mọi thứ mà tôi đã thử nghiệm.

USE [****YOUR_DATABASE****]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- Drop all referential integrity constraints --
-- Drop all Primary Key constraints.          --

DECLARE @sql  NVARCHAR(296)
DECLARE @table_name VARCHAR(128)

DECLARE @constraint_name VARCHAR(128)
SET @constraint_name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME

WHILE @row_number > 0
BEGIN
    BEGIN
        SELECT TOP 1 @table_name = tc2.TABLE_NAME, @constraint_name = rc1.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
        LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME
        AND rc1.CONSTRAINT_NAME > @constraint_name
        ORDER BY rc1.CONSTRAINT_NAME
        SELECT @sql = 'ALTER TABLE [dbo].[' + RTRIM(@table_name) +'] DROP CONSTRAINT [' + RTRIM(@constraint_name)+']'
        EXEC (@sql)
        PRINT 'Dropped Constraint: ' + @constraint_name + ' on ' + @table_name
        SET @row_number = @row_number - 1
    END
END
GO

-- Drop all tables --

DECLARE @sql  NVARCHAR(156)
DECLARE @name VARCHAR(128)
SET @name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM sysobjects WHERE [type] = 'U' AND category = 0

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

0

Đối với Bảng tạm thời thì phức tạp hơn một chút do thực tế có thể có một số khóa ngoại và cũng có ngoại lệ:

Drop table operation failed on table XXX because it is not a supported operation on system-versioned temporal tables

Những gì bạn có thể sử dụng là:

-- Disable constraints (foreign keys)
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

-- Disable system versioning (temporial tables)
EXEC sp_MSForEachTable '
 IF OBJECTPROPERTY(object_id(''?''), ''TableTemporalType'') = 2
  ALTER TABLE ? SET (SYSTEM_VERSIONING = OFF)
'
GO

-- Removing tables
EXEC sp_MSForEachTable 'DROP TABLE ?'
GO
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.