ดร็อปตารางทั้งหมดโพรซีเดอร์ที่เก็บทริกเกอร์ข้อ จำกัด และการอ้างอิงทั้งหมดในคำสั่ง sql เดียว


287

มีวิธีใดบ้างที่ฉันสามารถล้างฐานข้อมูลใน SQl Server 2005 โดยการวางตารางทั้งหมดและลบโพรซีเดอร์ที่เก็บทริกเกอร์ข้อ จำกัด และการอ้างอิงทั้งหมดในคำสั่ง SQL เดียว?

เหตุผลสำหรับคำขอ:

ฉันต้องการมีสคริปต์ DB สำหรับล้างฐานข้อมูลที่มีอยู่ซึ่งไม่ได้ใช้งานแทนที่จะสร้างขึ้นใหม่โดยเฉพาะอย่างยิ่งเมื่อคุณต้องส่งคำขอไปยังผู้ดูแลฐานข้อมูลของคุณและรอสักครู่เพื่อให้เสร็จ!

คำตอบ:


604

สคริปต์นี้จะล้างมุมมองทั้งหมด, SPS, ฟังก์ชั่น PKs, FKs และตาราง

/* 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
ถ้าฉันมีตารางบางอย่างที่ไม่อยู่ใน dbo schema ล่ะ
StuffHappens

8
สคริปต์นี้ไม่ได้พิจารณาสคีมาอื่น (นอกเหนือจาก dbo) อย่างชัดเจน ฉันทดสอบมันและมันจะทำงานตลอดไป ฉันคิดว่ามันจะถูกปรับแต่งสำหรับสถานการณ์นี้
W3Max

1
สคริปต์นี้ทำงานได้ค่อนข้างดี ไม่พบข้อมูลบางอย่างคุณต้องพิจารณาแอสเซมบลีและประเภทที่กำหนดโดยผู้ใช้ ดังนั้นเป็นตัวอย่างในขั้นตอนการวางของคุณทำ [type] = 'P' หรือ [type] = 'PC' เช่นกันเมื่อคุณวางชุดประกอบทำตามคำสั่งจาก assembly_ID desc เพื่อให้การอ้างอิงถูกลบในลำดับที่ถูกต้อง
Brian

1
ดูเหมือนว่าไม่จำเป็นต้องวางคีย์หลักทั้งหมดแยกจากกัน วางตารางควรดูแลที่
erikkallen

1
@erikkallen เหตุผลที่ต้องวางคีย์หลักก่อนเพื่อให้สามารถวางตารางในลำดับใดก็ได้โดยไม่ต้องกังวลกับการขึ้นต่อกันของ Foreign Key หากไม่มีสิ่งนั้นจะต้องใช้คำสั่งดรอปแบบซับซ้อนเพื่อให้แน่ใจว่าเอนทิตีแบบอ่อนทั้งหมดถูกดร็อปก่อนประเภทเอนทิตีที่แข็งแกร่งมิฉะนั้นสคริปต์จะล้มเหลวด้วยการละเมิดข้อ จำกัด ของ Referential Integrity
Jeff Puckett

118

ฉันใช้สคริปต์นี้โดย Adam Anderson อัปเดตเพื่อรองรับวัตถุในสคีมาอื่น ๆ กว่า 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

ที่มา: โพสต์บล็อกของ Adam Anderson


3
เกือบจะสมบูรณ์แบบ แต่มีหนึ่งกรณีขอบบ้า / โง่: ตารางที่มีคอลัมน์จากการคำนวณโดยใช้ฟังก์ชั่น แต่เพียงแค่เลื่อนส่วนของฟังก์ชั่นการตกแล้วคุณก็พร้อมที่จะไป!
Akos Lukacs

1
ใช้งานได้ดีก็จะลองและวางมุมมอง sys.database_firewall_rules ถ้าคุณเรียกใช้กับฐานข้อมูล Azure PAAS SQL แต่ Azure ไม่ป้องกันการวาง
Simon

ฉันเพิ่มสิ่งนี้หลังจาก "จาก sys.views" เพื่อแก้ไขปัญหา Azure SQL: WHERE schema_name (schema_id)! = 'sys'
UnionP

คุณพลาด: -- 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

สิ่งที่ดีที่สุดที่จะทำคือ " สร้างสคริปต์สำหรับวาง "

เลือกฐานข้อมูล -> คลิกขวา -> งาน -> สร้างสคริปต์ - จะเปิดตัวช่วยสร้างการสร้างสคริปต์

หลังจากเลือกวัตถุในชุดตัวเลือกการเขียนสคริปต์ให้คลิกปุ่มขั้นสูง

  • -> ตั้งค่าตัวเลือก 'สคริปต์เพื่อสร้าง' เป็นจริง (ต้องการสร้าง)

  • -> ตั้งค่าตัวเลือก ' สคริปต์เพื่อวาง ' เป็นจริง (ต้องการวาง)

  • -> เลือกช่องทำเครื่องหมายเพื่อเลือกวัตถุที่ต้องการสร้างสคริปต์

  • -> เลือกตัวเลือกเพื่อเขียนสคริปต์ (ไฟล์, หน้าต่างใหม่, คลิปบอร์ด)

  • มันรวมถึงวัตถุที่อ้างอิงตามค่าเริ่มต้น (และจะลดข้อ จำกัด ในตอนแรก)

    รันสคริปต์

วิธีนี้เราสามารถปรับแต่งสคริปต์ของเรา


ฟีเจอร์นี้มีให้ในเวอร์ชั่นใด? ในปี 2012 ฉันไม่เห็นมัน
Veverke

1
มันมีอยู่ใน SQL Studio 2012
Bernhard Döbler

ใช่ในปี 2012 แตกต่างกันเมื่อเล็กน้อยเมื่อเราเลือกสคริปต์ที่จะลดลงมีสคริปต์ที่จะลดลงและสคริปต์ที่จะสร้างในแบบเลื่อนลงเดียวกัน
Sk Asraf

2
สิ่งนี้รวมถึงลำดับหรือไม่
Markus Pscheidt

นี่เป็นตัวเลือกที่ดีที่สุดขอบคุณ @JP
Abdul Azeez

49

หากต้องการวางตารางทั้งหมด:

exec sp_MSforeachtable 'DROP TABLE ?'

แน่นอนว่าสิ่งนี้จะลดข้อ จำกัด ทริกเกอร์ ฯลฯ ทุกอย่างยกเว้นขั้นตอนการจัดเก็บ

masterสำหรับขั้นตอนที่เก็บไว้ฉันกลัวคุณจะต้องเก็บขั้นตอนอื่นที่เก็บไว้ใน


ฉันไม่รู้ว่า sp_MSforeachtable จะทำงานที่นี่หรือไม่ อาจลองวางตารางที่ยังมี FK อยู่และอาจล้มเหลว
Tom H

7
ใช้งานได้ดีมาก หากมีกุญแจต่างประเทศปรากฏอยู่คุณเพียงแค่เรียกใช้งานมันสองสามครั้ง
Mathias Lykkegaard Lorenzen

ไม่สามารถวางวัตถุ 'dbo.sometable' ได้เนื่องจากมีการอ้างอิงโดยข้อ จำกัด ของ FOREIGN KEY
ผู้สนับสนุนของ Devil

ตรวจสอบนี้บทความสำหรับการลบstored proceduresฯลฯ
shaijut

สำหรับการอ้างอิงนี่จะไม่ทำงานสำหรับฐานข้อมูล Azure PAAS SQL
Simon

14

ฉันจะทำมันในสองงบ: DROP DATABASE ???

แล้ว CREATE DATABASE ???


6
หากคุณไม่มีสิทธิ์เหล่านี้และคุณไม่สามารถให้สคริปต์แก่ผู้ที่มีสิทธิ์ทำงานได้คุณไม่ควรพิจารณาทำสิ่งนี้ มีเหตุผลที่นักพัฒนาไม่ได้รับสิทธิ์เหล่านี้
HLGEM

@HLGEM dba บางคนไม่รู้วิธีตั้งค่าสิทธิ์ โฮสต์เว็บไซต์ของฉันไม่อนุญาตให้ฉันลบฐานข้อมูลของฉันเอง ฉันคิดว่าคุณต้องการสิทธิ์ยกระดับพิเศษในการวางฐานข้อมูลซึ่งอาจทำให้คุณสามารถวางฐานข้อมูลผู้ใช้รายอื่นซึ่งไม่มีความเสี่ยงและความปลอดภัย
Tony_Henrich

1
ในกรณีของ AWS RDS การสร้างฐานข้อมูลใหม่ใช้เวลาอย่างน้อย 15-20 นาทีและไม่ต้องการสร้างฐานข้อมูลใหม่อีกครั้ง
Kamran Qadir

9

ฉันลองใช้สคริปต์บางส่วนที่นี่ แต่พวกเขาไม่ทำงานสำหรับฉันเนื่องจากฉันมีตารางของฉันใน schemas ดังนั้นฉันรวบรวมต่อไปนี้ โปรดทราบว่าสคริปต์นี้ใช้รายการสกีมาและลดลงตามลำดับ คุณต้องตรวจสอบให้แน่ใจว่าคุณมีการสั่งซื้อที่สมบูรณ์ในแบบแผนของคุณ หากมีการอ้างอิงแบบวงกลมใด ๆ มันจะล้มเหลว

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 นี่จะวางตารางที่ไม่ได้อยู่ใน dbo schema
David Roussel

ไม่แน่ใจว่าทำไมฉันถูก downvoted เมื่อคำตอบของฉันทำงานและลดลงทุกตารางมุมมองและเก็บไว้ proc ไม่เพียง แต่ผู้ที่อยู่ใน dbo (เหมือนคำตอบหลักที่ไม่ได้ทำงานสำหรับฉัน)
เดวิด Roussel

7

สำรองฐานข้อมูลที่ว่างเปล่าโดยสมบูรณ์ แทนที่จะปล่อยวัตถุทั้งหมดเพียงคืนค่าการสำรองข้อมูล


3
ตัวอย่างฐานข้อมูลที่ดีสำหรับการสำรองและคืนค่าฐานข้อมูลของคุณจะเป็นฐานข้อมูลโมเดลเนื่องจากเป็นที่ที่ CREATE DATABASE ได้รับเทมเพลตสำหรับฐานข้อมูลใหม่
David Parvin

7

นี่คือสิ่งที่ฉันได้ลอง:

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

สิ่งที่จะพิมพ์ออกมาเพียงแค่คัดลอกทั้งหมดและวางลงในคิวรีใหม่ จะเป็นการลบตารางทั้งหมด


3

ฉันตั้งใจรันสคริปต์ db init กับฐานข้อมูลหลักของฉันคืนนี้ ยังไงก็ตามฉันรีบวิ่งเข้าไปในกระทู้นี้ ฉันใช้: exec sp_MSforeachtable 'DROP TABLE?' คำตอบ แต่ต้องดำเนินการหลาย ๆ ครั้งจนกว่ามันจะไม่เกิดข้อผิดพลาด (การอ้างอิง) หลังจากนั้นฉันก็สะดุดกับหัวข้ออื่น ๆ และทำสิ่งนี้ร่วมกันเพื่อลดขั้นตอนและฟังก์ชัน

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

ลองสิ่งนี้

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

นอกจากคำตอบของ @ Ivan แล้วประเภททั้งหมดจะต้องรวมอยู่ด้วย

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

คุณต้องปิดการใช้งานทั้งหมดtriggersและconstraintsก่อน

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

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

หลังจากนั้นคุณสามารถสร้างสคริปต์สำหรับการลบวัตถุเป็น

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

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

ดำเนินการข้อความสั่งที่สร้างขึ้น


0

ดูเหมือนว่าเป็นคุณลักษณะที่ค่อนข้างอันตรายสำหรับฉัน หากคุณใช้สิ่งนี้ฉันจะทำให้แน่ใจว่าปลอดภัยในวิธีที่คุณจะไม่สามารถดำเนินการนี้ต่ออุบัติเหตุ

ตามที่แนะนำไว้ก่อนที่คุณจะสามารถจัดเก็บกระบวนการด้วยตนเองได้ ใน SQL Server 2005 คุณสามารถดูตารางระบบนี้เพื่อตรวจสอบและค้นหาวัตถุที่คุณต้องการวาง

select * from sys.objects

0

ที่นี่ฉันพบแบบสอบถามใหม่เพื่อลบ sp, ฟังก์ชั่นและทริกเกอร์ทั้งหมด

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

เพื่อเพิ่มคำตอบของ Ivan ฉันยังจำเป็นต้องลบประเภทที่ผู้ใช้กำหนดเองทั้งหมดด้วยดังนั้นฉันจึงได้เพิ่มสิ่งนี้ลงในสคริปต์:

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

ไม่มีคำสั่งเดียวที่สามารถใช้เพื่อให้บรรลุเป้าหมายนี้

แน่นอนคุณสามารถสร้างตัวคุณเองstored procedureที่คุณสามารถใช้ในการดำเนินงานการบริหารต่างๆเหล่านี้

จากนั้นคุณสามารถดำเนินการตามขั้นตอนโดยใช้คำสั่งเดียวนี้

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

ในการลบวัตถุทั้งหมดใน oracle:

1) แบบไดนามิก

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) แบบคงที่

    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

ลองใช้ sql2012 ขึ้นไป

สิ่งนี้จะช่วยในการลบวัตถุทั้งหมดด้วยสคีมาที่เลือก

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)


-1

ลองสิ่งนี้ ....

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.