Bỏ tất cả các bảng, thủ tục được lưu trữ, kích hoạt, ràng buộc và tất cả các phụ thuộc trong một câu lệnh sql


287

Có cách nào để tôi có thể dọn dẹp cơ sở dữ liệu trong SQl Server 2005 bằng cách bỏ tất cả các bảng và xóa các thủ tục được lưu trữ, kích hoạt, ràng buộc và tất cả các phụ thuộc trong một câu lệnh SQL không?

LÝ DO YÊU CẦU:

Tôi muốn có một tập lệnh DB để dọn sạch DB hiện tại không được sử dụng thay vì tạo tập lệnh mới, đặc biệt là khi bạn phải gửi yêu cầu tới quản trị viên DB của mình và đợi một lúc để hoàn thành!

Câu trả lời:


604

tập lệnh này xóa tất cả các khung nhìn, SPS, các chức năng PK, FK và bảng.

/* Drop all non-system stored procs */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

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

WHILE @name is not null
BEGIN
    SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Procedure: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

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

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

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

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

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Function: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

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

14
Nếu tôi có một số bảng không có trong lược đồ dbo thì sao?
StuffHappens

8
Kịch bản này chắc chắn không đưa các lược đồ khác (trừ dbo) vào tài khoản. Tôi đã thử nó và nó chạy mãi mãi. Tôi tưởng tượng nó có thể được điều chỉnh cho kịch bản này.
W3Max

1
Kịch bản này hoạt động khá tốt. Thiếu một vài điều, bạn cần tính đến các cụm và các loại do người dùng xác định. Vì vậy, như một ví dụ trong Quy trình thả của bạn, hãy thực hiện [type] = 'P' OR [type] = 'PC' khi bạn thả lắp ráp thực hiện một đơn đặt hàng bằng assembly_ID desc để các phần phụ thuộc được xóa theo đúng thứ tự.
Brian

1
Dường như không cần thiết phải bỏ tất cả các khóa chính; làm rơi bàn nên lo việc đó
erikkallen

1
@erikkallen lý do các Khóa chính phải được loại bỏ trước tiên là để các bảng sau đó có thể được loại bỏ theo bất kỳ thứ tự nào mà không cần quan tâm đến các phụ thuộc của Khóa ngoài. Nếu không có điều đó, một lệnh thả phức tạp sẽ cần được sử dụng để đảm bảo tất cả các loại thực thể yếu được loại bỏ trước các loại thực thể mạnh, nếu không, tập lệnh sẽ thất bại với các vi phạm ràng buộc toàn vẹn tham chiếu.
Jeff Puckett

118

Tôi đang sử dụng tập lệnh này của Adam Anderson, được cập nhật để hỗ trợ các đối tượng trong các lược đồ khác ngoài dbo.

declare @n char(1)
set @n = char(10)

declare @stmt nvarchar(max)

-- procedures
select @stmt = isnull( @stmt + @n, '' ) +
    'drop procedure [' + schema_name(schema_id) + '].[' + name + ']'
from sys.procedures


-- check constraints
select @stmt = isnull( @stmt + @n, '' ) +
'alter table [' + schema_name(schema_id) + '].[' + object_name( parent_object_id ) + ']    drop constraint [' + name + ']'
from sys.check_constraints

-- functions
select @stmt = isnull( @stmt + @n, '' ) +
    'drop function [' + schema_name(schema_id) + '].[' + name + ']'
from sys.objects
where type in ( 'FN', 'IF', 'TF' )

-- views
select @stmt = isnull( @stmt + @n, '' ) +
    'drop view [' + schema_name(schema_id) + '].[' + name + ']'
from sys.views

-- foreign keys
select @stmt = isnull( @stmt + @n, '' ) +
    'alter table [' + schema_name(schema_id) + '].[' + object_name( parent_object_id ) + '] drop constraint [' + name + ']'
from sys.foreign_keys

-- tables
select @stmt = isnull( @stmt + @n, '' ) +
    'drop table [' + schema_name(schema_id) + '].[' + name + ']'
from sys.tables

-- user defined types
select @stmt = isnull( @stmt + @n, '' ) +
    'drop type [' + schema_name(schema_id) + '].[' + name + ']'
from sys.types
where is_user_defined = 1


exec sp_executesql @stmt

Nguồn: một bài đăng trên blog của Adam Anderson


3
gần như hoàn hảo, nhưng có một trường hợp cạnh điên / ngu: một bảng có cột được tính bằng hàm. Nhưng chỉ cần di chuyển các phần chức năng thả, và bạn là tốt để đi!
Akos Lukacs

1
hoạt động rất tốt, nó sẽ thử và thả chế độ xem sys.database_firewall_rules nếu bạn chạy nó với Cơ sở dữ liệu SQL Azure PAAS nhưng vì phương tiện không ngăn được.
Simon

Tôi đã thêm phần này sau "từ sys.view" để giải quyết vấn đề Azure SQL: WHERE giản đồ tên (lược đồ_id)! = '
Sys

Bạn đã bỏ lỡ điều này: -- system-versioned tables SELECT @stmt = isnull(@stmt + CHAR(10), '') + 'alter table [' + schema_name(schema_id) + '].[' + name + '] SET ( SYSTEM_VERSIONING = OFF)' FROM sys.tables WHERE TEMPORAL_TYPE = 2;
Christopher Shortt

93

Điều tốt nhất để làm điều đó là " Tạo tập lệnh cho thả "

Chọn Cơ sở dữ liệu -> Nhấp chuột phải -> Nhiệm vụ -> Tạo tập lệnh - sẽ mở trình hướng dẫn để tạo tập lệnh

Sau khi chọn đối tượng trong tùy chọn Tập lệnh, bấm vào Nút Nâng cao

  • -> Đặt tùy chọn 'Script để tạo' thành true (muốn tạo)
  • -> Đặt tùy chọn ' Script thành Drop ' thành true (muốn thả)
  • -> Chọn hộp kiểm để chọn đối tượng muốn tạo tập lệnh
  • -> Chọn lựa chọn để viết tập lệnh (Tệp, Cửa sổ mới, Bảng tạm)
  • Nó bao gồm các đối tượng phụ thuộc theo mặc định. (Và sẽ bỏ ràng buộc lúc đầu)

    Thực thi kịch bản

Bằng cách này, chúng tôi có thể tùy chỉnh tập lệnh của chúng tôi.


Phiên bản này có tính năng nào? Năm 2012 tôi không thấy nó.
Veverke 8/2/2016

1
Nó có trong SQL Studio 2012.
Bernhard Döbler 17/2/2016

vâng, vào năm 2012 khi có chút khác biệt khi chúng ta chọn Script để thả ở đó Script để thảScript để tạo trong cùng một danh sách thả xuống.
Sk Asraf

2
Điều này bao gồm các trình tự?
Markus Pscheidt

Đây là lựa chọn tốt nhất, Cảm ơn @JP
Abdul Azeez

49

Để thả tất cả các bảng:

exec sp_MSforeachtable 'DROP TABLE ?'

Tất nhiên, điều này sẽ bỏ tất cả các ràng buộc, kích hoạt, vv, tất cả mọi thứ trừ các thủ tục được lưu trữ.

Đối với các thủ tục được lưu trữ, tôi e rằng bạn sẽ cần một thủ tục được lưu trữ khác được lưu trữ trong master.


Tôi không biết nếu sp_MSforeachtable sẽ hoạt động ở đây. Nó có thể cố gắng thả một bảng vẫn còn FK và điều đó sẽ thất bại.
Tom H

7
Hoạt động tuyệt vời yeah. Nếu có khóa ngoại, bạn chỉ cần thực hiện một vài lần.
Mathias Lykkegaard Lorenzen

Không thể thả đối tượng 'dbo.sometable' vì nó được tham chiếu bởi ràng buộc FOREIGN KEY.
Devil's Advocate

kiểm tra này bài viết cho xóa stored procedures, vv
shaijut

chỉ để tham khảo, điều này sẽ không hoạt động đối với cơ sở dữ liệu SQL Azure PAAS.
Simon

14

Tôi sẽ làm điều đó trong hai tuyên bố: DROP DATABASE ???

và sau đó CREATE DATABASE ???


6
Nếu bạn không có những quyền này và bạn không thể đưa kịch bản cho ai đó có quyền điều hành, bạn không nên suy nghĩ về việc này. Có một lý do các nhà phát triển không có được các quyền này.
HLGEM

@HLGEM Một số dba không biết cách thiết lập quyền. Máy chủ trang web của tôi không cho phép tôi bỏ cơ sở dữ liệu của riêng mình. Tôi nghĩ rằng bạn cần các quyền nâng cao đặc biệt để loại bỏ cơ sở dữ liệu có thể cho phép bạn loại bỏ cơ sở dữ liệu người dùng khác, điều này không có rủi ro lớn về bảo mật.
Tony_Henrich

1
Trong trường hợp AWS RDS, việc tạo lại db mất ít nhất 15-20 phút và không muốn tạo lại db
Kamran Qadir

9

Tôi đã thử một số kịch bản ở đây, nhưng chúng không hoạt động với tôi, vì tôi có các bảng của mình trong các lược đồ. Vì vậy, tôi kết hợp như sau. Lưu ý rằng tập lệnh này lấy một danh sách các lược đồ và sau đó thả theo thứ tự. Bạn cần đảm bảo rằng bạn có một thứ tự hoàn chỉnh trong lược đồ của bạn. Nếu có bất kỳ phụ thuộc vòng tròn, thì nó sẽ thất bại.

PRINT 'Dropping whole database'
GO

------------------------------------------
-- Drop constraints
------------------------------------------
DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT DISTINCT sql = 'ALTER TABLE ['+tc2.CONSTRAINT_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
PRINT @Sql
Exec (@Sql)
FETCH NEXT FROM @Cursor INTO @Sql
END

CLOSE @Cursor DEALLOCATE @Cursor
GO


------------------------------------------
-- Drop views
------------------------------------------

DECLARE @sql VARCHAR(MAX) = ''
        , @crlf VARCHAR(2) = CHAR(13) + CHAR(10) ;

SELECT @sql = @sql + 'DROP VIEW ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(v.name) +';' + @crlf
FROM   sys.views v

PRINT @sql;
EXEC(@sql);
GO
------------------------------------------
-- Drop procs
------------------------------------------
PRINT 'Dropping all procs ...'
GO

DECLARE @sql VARCHAR(MAX) = ''
        , @crlf VARCHAR(2) = CHAR(13) + CHAR(10) ;

SELECT @sql = @sql + 'DROP PROC ' + QUOTENAME(SCHEMA_NAME(p.schema_id)) + '.' + QUOTENAME(p.name) +';' + @crlf
FROM   [sys].[procedures] p

PRINT @sql;
EXEC(@sql);
GO

------------------------------------------
-- Drop tables
------------------------------------------
PRINT 'Dropping all tables ...'
GO
EXEC sp_MSForEachTable 'DROP TABLE ?'
GO

------------------------------------------
-- Drop sequences
------------------------------------------

PRINT 'Dropping all sequences ...'
GO
DECLARE @DropSeqSql varchar(1024)
DECLARE DropSeqCursor CURSOR FOR
SELECT DISTINCT 'DROP SEQUENCE ' + s.SEQUENCE_SCHEMA + '.' + s.SEQUENCE_NAME
    FROM INFORMATION_SCHEMA.SEQUENCES s

OPEN DropSeqCursor

FETCH NEXT FROM DropSeqCursor INTO @DropSeqSql

WHILE ( @@FETCH_STATUS <> -1 )
BEGIN
    PRINT @DropSeqSql
    EXECUTE( @DropSeqSql )
    FETCH NEXT FROM DropSeqCursor INTO @DropSeqSql
END

CLOSE DropSeqCursor
DEALLOCATE DropSeqCursor
GO

------------------------------------------
-- Drop Schemas
------------------------------------------


DECLARE @schemas as varchar(1000) = 'StaticData,Ird,DataImport,Collateral,Report,Cds,CommonTrade,MarketData,TypeCode'
DECLARE @schemasXml as xml = cast(('<schema>'+replace(@schemas,',' ,'</schema><schema>')+'</schema>') as xml)

DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT sql = 'DROP SCHEMA ['+schemaName+']' FROM 
(SELECT CAST(T.schemaName.query('text()') as VARCHAR(200)) as schemaName FROM @schemasXml.nodes('/schema') T(schemaName)) as X
JOIN information_schema.schemata S on S.schema_name = X.schemaName

OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql

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

CLOSE @Cursor DEALLOCATE @Cursor
GO

@StuffHappens điều này sẽ bỏ các bảng không có trong lược đồ dbo.
David Roussel

Không chắc chắn lý do tại sao tôi bị hạ thấp khi câu trả lời của tôi hoạt động, và bỏ tất cả các bảng, lượt xem và lưu trữ, không chỉ những người trong dbo (không giống như câu trả lời chính không phù hợp với tôi)
David Roussel

7

Sao lưu một cơ sở dữ liệu hoàn toàn trống rỗng. Thay vì bỏ tất cả các đối tượng, chỉ cần khôi phục lại bản sao lưu.


3
một cơ sở dữ liệu mẫu tốt để sao lưu và khôi phục cơ sở dữ liệu của bạn sẽ là cơ sở dữ liệu mô hình, vì đó là nơi CREATE DATABASE lấy mẫu cho cơ sở dữ liệu mới.
David Parvin

7

Đây là những gì tôi đã thử:

SELECT 'DROP TABLE [' + SCHEMA_NAME(schema_id) + '].[' + name + ']' FROM sys.tables

Những gì đầu ra nó sẽ in, chỉ cần sao chép tất cả và dán vào truy vấn mới và nhấn thực hiện. Điều này sẽ xóa tất cả các bảng.


3

Tôi đã vô tình chạy một kịch bản db init đối với cơ sở dữ liệu chủ của tôi tối nay. Dù sao, tôi nhanh chóng chạy vào chủ đề này. Tôi đã sử dụng: exec sp_MSforeachtable 'DROP TABLE?' trả lời, nhưng phải thực hiện nó nhiều lần cho đến khi nó không bị lỗi (phụ thuộc.) Sau đó, tôi tình cờ phát hiện ra một số luồng khác và ghép nó lại với nhau để bỏ tất cả các thủ tục và hàm được lưu trữ.

DECLARE mycur CURSOR FOR select O.type_desc,schema_id,O.name
from 
    sys.objects             O LEFT OUTER JOIN
    sys.extended_properties E ON O.object_id = E.major_id
WHERE
    O.name IS NOT NULL
    AND ISNULL(O.is_ms_shipped, 0) = 0
    AND ISNULL(E.name, '') <> 'microsoft_database_tools_support'
    AND ( O.type_desc = 'SQL_STORED_PROCEDURE' OR O.type_desc = 'SQL_SCALAR_FUNCTION' )
ORDER BY O.type_desc,O.name;

OPEN mycur;

DECLARE @schema_id int;
DECLARE @fname varchar(256);
DECLARE @sname varchar(256);
DECLARE @ftype varchar(256);

FETCH NEXT FROM mycur INTO @ftype, @schema_id, @fname;

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sname = SCHEMA_NAME( @schema_id );
    IF @ftype = 'SQL_STORED_PROCEDURE'
        EXEC( 'DROP PROCEDURE "' + @sname + '"."' + @fname + '"' );
    IF @ftype = 'SQL_SCALAR_FUNCTION'
        EXEC( 'DROP FUNCTION "' + @sname + '"."' + @fname + '"' );

    FETCH NEXT FROM mycur INTO @ftype, @schema_id, @fname;
END

CLOSE mycur
DEALLOCATE mycur

GO

2

Thử cái này

Select 'ALTER TABLE ' + Table_Name  +'  drop constraint ' + Constraint_Name  from Information_Schema.CONSTRAINT_TABLE_USAGE

Select 'drop Procedure ' + specific_name  from Information_Schema.Routines where specific_name not like 'sp%' AND specific_name not like 'fn_%'

Select 'drop View ' + table_name  from Information_Schema.tables where Table_Type = 'VIEW'

SELECT 'DROP TRIGGER ' + name FROM sysobjects WHERE type = 'tr'

Select 'drop table ' + table_name  from Information_Schema.tables where Table_Type = 'BASE TABLE'

2

Ngoài câu trả lời của @ Ivan, tất cả các loại cần phải được đưa vào

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

SELECT @name = (SELECT TOP 1 [name] FROM sys.types where is_user_defined = 1 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TYPE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Type: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sys.types where is_user_defined = 1 AND [name] > @name ORDER BY [name])
END
GO

1

Bạn phải vô hiệu hóa tất cả triggersconstraintsđầu tiên.

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

EXEC sp_MSforeachtable @command1="ALTER TABLE ? DISABLE TRIGGER ALL"

Sau đó, bạn có thể tạo các tập lệnh để xóa các đối tượng như

SELECT 'Drop Table '+name FROM sys.tables WHERE type='U';

SELECT 'Drop Procedure '+name FROM  sys.procedures WHERE type='P';

Thực hiện các báo cáo được tạo ra.


0

Có vẻ như một tính năng khá nguy hiểm với tôi. Nếu bạn thực hiện một cái gì đó như thế này, tôi sẽ đảm bảo bảo mật nó đúng cách theo cách bạn sẽ không thể chạy điều này mỗi tai nạn.

Như đã đề xuất trước khi bạn có thể tự thực hiện một số loại thủ tục được lưu trữ. Trong SQL Server 2005, bạn có thể xem bảng hệ thống này để xác định và tìm các đối tượng bạn muốn thả.

select * from sys.objects

0

Ở đây tôi tìm thấy truy vấn mới để xóa tất cả sp, chức năng và kích hoạt

declare @procName varchar(500)
declare cur cursor 

for select [name] from sys.objects where type = 'p'
open cur
fetch next from cur into @procName
while @@fetch_status = 0
begin
    exec('drop procedure ' + @procName)
    fetch next from cur into @procName
end
close cur
deallocate cur

0

Để thêm vào câu trả lời của Ivan, tôi cũng có nhu cầu bỏ tất cả các loại do người dùng xác định, vì vậy tôi đã thêm phần này vào tập lệnh:

/* Drop all user-defined types */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (select TOP 1 [name] from sys.types where is_user_defined = 1)

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TYPE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Type: ' + @name
    SELECT @name = (select TOP 1 [name] from sys.types where is_user_defined = 1)
END
GO

0

Không có tuyên bố duy nhất có thể được sử dụng để đạt được mục tiêu này.

Tất nhiên bạn có thể tạo cho mình một stored procedure cái mà bạn có thể sử dụng để thực hiện các nhiệm vụ quản trị khác nhau này.

Sau đó, bạn có thể thực hiện thủ tục bằng cách sử dụng câu lệnh đơn này.

Exec sp_CleanDatabases @DatabaseName='DBname'

0
DECLARE @name VARCHAR(255)
DECLARE @type VARCHAR(10)
DECLARE @prefix VARCHAR(255)
DECLARE @sql VARCHAR(255)

DECLARE curs CURSOR FOR
SELECT [name], xtype
FROM sysobjects
WHERE xtype IN ('U', 'P', 'FN', 'IF', 'TF', 'V', 'TR') -- Configuration point 1
ORDER BY name

OPEN curs
FETCH NEXT FROM curs INTO @name, @type

WHILE @@FETCH_STATUS = 0
BEGIN
-- Configuration point 2
SET @prefix = CASE @type
WHEN 'U' THEN 'DROP TABLE'
WHEN 'P' THEN 'DROP PROCEDURE'
WHEN 'FN' THEN 'DROP FUNCTION'
WHEN 'IF' THEN 'DROP FUNCTION'
WHEN 'TF' THEN 'DROP FUNCTION'
WHEN 'V' THEN 'DROP VIEW'
WHEN 'TR' THEN 'DROP TRIGGER'
END

SET @sql = @prefix + ' ' + @name
PRINT @sql
EXEC(@sql)
FETCH NEXT FROM curs INTO @name, @type
END

CLOSE curs
DEALLOCATE curs

0

Để loại bỏ tất cả các đối tượng trong orory:

1) Năng động

DECLARE
CURSOR IX IS
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE ='TABLE' 
AND OWNER='SCHEMA_NAME';
 CURSOR IY IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE 
IN ('SEQUENCE',
'PROCEDURE',
'PACKAGE',
'FUNCTION',
'VIEW') AND  OWNER='SCHEMA_NAME';
 CURSOR IZ IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('TYPE') AND  OWNER='SCHEMA_NAME';
BEGIN
 FOR X IN IX LOOP
   EXECUTE IMMEDIATE('DROP '||X.OBJECT_TYPE||' '||X.OBJECT_NAME|| ' CASCADE CONSTRAINT');
 END LOOP;
 FOR Y IN IY LOOP
   EXECUTE IMMEDIATE('DROP '||Y.OBJECT_TYPE||' '||Y.OBJECT_NAME);
 END LOOP;
 FOR Z IN IZ LOOP
   EXECUTE IMMEDIATE('DROP '||Z.OBJECT_TYPE||' '||Z.OBJECT_NAME||' FORCE ');
 END LOOP;
END;
/

2) Tĩnh

    SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' FROM user_tables
        union ALL
        select 'drop '||object_type||' '|| object_name || ';' from user_objects 
        where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION')
        union ALL
        SELECT 'drop '
        ||object_type
        ||' '
        || object_name
        || ' force;'
        FROM user_objects
        WHERE object_type IN ('TYPE');

0

hãy thử điều này với sql2012 trở lên,

điều này sẽ giúp xóa tất cả các đối tượng bằng lược đồ đã chọn

DECLARE @MySchemaName VARCHAR(50)='dbo', @sql VARCHAR(MAX)='';
DECLARE @SchemaName VARCHAR(255), @ObjectName VARCHAR(255), @ObjectType VARCHAR(255), @ObjectDesc VARCHAR(255), @Category INT;

DECLARE cur CURSOR FOR
    SELECT  (s.name)SchemaName, (o.name)ObjectName, (o.type)ObjectType,(o.type_desc)ObjectDesc,(so.category)Category
    FROM    sys.objects o
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
    INNER JOIN sysobjects so ON so.name=o.name
    WHERE s.name = @MySchemaName
    AND so.category=0
    AND o.type IN ('P','PC','U','V','FN','IF','TF','FS','FT','PK','TT')

OPEN cur
FETCH NEXT FROM cur INTO @SchemaName,@ObjectName,@ObjectType,@ObjectDesc,@Category

SET @sql='';
WHILE @@FETCH_STATUS = 0 BEGIN    
    IF @ObjectType IN('FN', 'IF', 'TF', 'FS', 'FT') SET @sql=@sql+'Drop Function '+@MySchemaName+'.'+@ObjectName+CHAR(13)
    IF @ObjectType IN('V') SET @sql=@sql+'Drop View '+@MySchemaName+'.'+@ObjectName+CHAR(13)
    IF @ObjectType IN('P') SET @sql=@sql+'Drop Procedure '+@MySchemaName+'.'+@ObjectName+CHAR(13)
    IF @ObjectType IN('U') SET @sql=@sql+'Drop Table '+@MySchemaName+'.'+@ObjectName+CHAR(13)

    --PRINT @ObjectName + ' | ' + @ObjectType
    FETCH NEXT FROM cur INTO @SchemaName,@ObjectName,@ObjectType,@ObjectDesc,@Category
END
CLOSE cur;    
DEALLOCATE cur;
SET @sql=@sql+CASE WHEN LEN(@sql)>0 THEN 'Drop Schema '+@MySchemaName+CHAR(13) ELSE '' END
PRINT @sql
EXECUTE (@sql)

0

Một cách khác là:

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

-1

thử cái này....

USE DATABASE
GO
DECLARE @tname VARCHAR(150)
DECLARE @strsql VARCHAR(300)

SELECT @tname = (SELECT TOP 1 [name] FROM sys.objects WHERE [type] = 'U' and [name] like N'TableName%' ORDER BY [name])

WHILE @tname IS NOT NULL
BEGIN
    SELECT @strsql = 'DROP TABLE [dbo].[' + RTRIM(@tname) +']'
    EXEC (@strsql)
    PRINT 'Dropped Table : ' + @tname
    SELECT @tname = (SELECT TOP 1 [name] FROM sys.objects WHERE [type] = 'U' AND [name] like N'TableName%'  AND [name] > @tname ORDER BY [name])
END
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.