2012-01-19 28 views

Trả lời

75

Điều này sẽ tạo tất cả các câu lệnh DROP TABLE cho bạn và IN câu lệnh SQL. Sau đó bạn có thể xác thực đó là những gì bạn mong đợi trước khi sao chép và thực thi. Chỉ cần chắc chắn rằng bạn chắc chắn 100% ... có thể lấy một bản sao lưu đầu tiên :)

DECLARE @SqlStatement NVARCHAR(MAX) 
SELECT @SqlStatement = 
    COALESCE(@SqlStatement, N'') + N'DROP TABLE [DBO1].' + QUOTENAME(TABLE_NAME) + N';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'DBO1' and TABLE_TYPE = 'BASE TABLE' 

PRINT @SqlStatement 
+6

Và nếu họ thực sự ** ** muốn làm điều đó trong một đi, họ có thể Exec (hoặc sp_executesql exec) @SqlStatement ở cuối. – DaveShaw

+0

sẽ không hoạt động nếu cơ sở dữ liệu của bạn có bất kỳ ràng buộc nào tại tất cả – ladieu

+0

@ladieu - điều gì khiến bạn nói vậy? Nó hoạt động nếu bạn có các ràng buộc ... – AdaTheDev

25

chủ đề Hơi cũ tôi biết, nhưng tôi đang tìm kiếm một cái gì đó như thế này và tìm thấy câu trả lời ban đầu rất hữu ích. Điều đó nói rằng, tập lệnh cũng sẽ cố gắng giảm các chế độ xem có thể tồn tại trong lược đồ đó và cung cấp cho bạn thông báo lỗi vì bạn sẽ cố gắng xóa chế độ xem bằng cách phát hành câu lệnh DROP TABLE.

Tôi đã kết thúc bằng văn bản này bởi vì tôi cần phải thả tất cả các bảng, khung nhìn, thủ tục và chức năng từ một lược đồ đã cho. Có lẽ không phải là cách thanh lịch nhất để thực hiện điều này, nhưng nó làm việc cho tôi và tôi nghĩ rằng tôi muốn chia sẻ.

DECLARE @Sql VARCHAR(MAX) 
     , @Schema varchar(20) 

SET @Schema = 'Integration' --put your schema name between these quotes 

--tables 
SELECT @Sql = COALESCE(@Sql,'') + 'DROP TABLE %SCHEMA%.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @Schema 
    AND TABLE_TYPE = 'BASE TABLE' 
ORDER BY TABLE_NAME 


--views 
SELECT @Sql = COALESCE(@Sql,'') + 'DROP VIEW %SCHEMA%.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @Schema 
    AND TABLE_TYPE = 'VIEW' 
ORDER BY TABLE_NAME 

--Procedures 
SELECT @Sql = COALESCE(@Sql,'') + 'DROP PROCEDURE %SCHEMA%.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = @Schema 
    AND ROUTINE_TYPE = 'PROCEDURE' 
ORDER BY ROUTINE_NAME 

--Functions 
SELECT @Sql = COALESCE(@Sql,'') + 'DROP FUNCTION %SCHEMA%.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = @Schema 
    AND ROUTINE_TYPE = 'FUNCTION' 
ORDER BY ROUTINE_NAME 


SELECT @Sql = COALESCE(REPLACE(@Sql,'%SCHEMA%',@Schema), '') 

PRINT @Sql 
12

Xây dựng câu trả lời của @ Kevo, tôi thêm phần sau đây để xóa tất cả các ràng buộc khóa ngoài trước khi xóa bảng. Tôi đã chỉ được thử nghiệm trên SQL2008 R2

select @Sql = COALESCE(@Sql,'') + 'ALTER TABLE %SCHEMA%.' + t.name + ' drop constraint ' + 
OBJECT_NAME(d.constraint_object_id) + ';' + CHAR(13) 
from sys.tables t 
    join sys.foreign_key_columns d on d.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id 
where s.name = @Schema 
ORDER BY t.name; 
7

Cũng xây dựng dựa trên câu trả lời @ Kevo, tôi thêm vòng lặp while sau cho một vấn đề tôi gặp phải với tuyên bố TSQL Print. Chuỗi tin nhắn có thể dài tối đa 8.000 ký tự. Nếu lớn hơn 8.000 bản in sẽ cắt bớt bất kỳ ký tự còn lại nào.

DECLARE @SqlLength int 
     , @SqlPosition int = 1 
     , @printMaxLength int = 8000 

SET @SqlLength = LEN(@Sql) 

WHILE (@SqlLength) > @printMaxLength 
BEGIN 
    PRINT SUBSTRING(@Sql, @SqlPosition, @printMaxLength) 
    SET @SqlLength = @SqlLength - @printMaxLength 
    SET @SqlPosition = @SqlPosition + @printMaxLength 
END 
IF (@SqlLength) < @printMaxLength AND (@SqlLength) > 0 
BEGIN 
    PRINT SUBSTRING(@Sql, @SqlPosition, @printMaxLength) 
END 
1

Tôi kết hợp câu trả lời từ @ raider33 và @Kevo thành một giải pháp để thực thi trực tiếp.

DECLARE @SqlStatement NVARCHAR(MAX) 
DECLARE @schema varchar(30) = 'SCHEMA_NAME'; 

select @SqlStatement = COALESCE(@SqlStatement,'') + 'ALTER TABLE '[email protected]+'.' + t.name + ' drop constraint ' + 
OBJECT_NAME(d.constraint_object_id) + ';' + CHAR(13) + CHAR(10) 
from sys.tables t 
    join sys.foreign_key_columns d on d.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id 
where s.name = @schema 
ORDER BY t.name; 

SELECT @SqlStatement += 
    COALESCE(@SqlStatement, '') + 'DROP TABLE ' + @schema +'.'+ QUOTENAME(TABLE_NAME) + ';' + CHAR(13) + CHAR(10) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @schema 

EXECUTE sp_executesql @SqlStatement 
9

Xây dựng trên các câu trả lời khác, đây là một thủ tục được lưu trữ spDropSchema làm giảm tất cả các đối tượng trong lược đồ và chính lược đồ.

Lưu ý rằng quy trình cũng cố gắng xóa các đối tượng chuỗi, vì vậy nó sẽ chỉ hoạt động trên SQL Server 2012 trở lên.

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'spDropSchema') 
    BEGIN 
     DROP PROCEDURE spDropSchema 
    END 
GO 

CREATE PROCEDURE spDropSchema(@Schema nvarchar(200)) 
AS 

DECLARE @Sql NVARCHAR(MAX) = ''; 

--constraints 
SELECT @Sql = @Sql + 'ALTER TABLE '+ QUOTENAME(@Schema) + '.' + QUOTENAME(t.name) + ' DROP CONSTRAINT ' + QUOTENAME(f.name) + ';' + CHAR(13) 
FROM sys.tables t 
    inner join sys.foreign_keys f on f.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id 
WHERE s.name = @Schema 
ORDER BY t.name; 

--tables 
SELECT @Sql = @Sql + 'DROP TABLE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @Schema AND TABLE_TYPE = 'BASE TABLE' 
ORDER BY TABLE_NAME 

--views 
SELECT @Sql = @Sql + 'DROP VIEW '+ QUOTENAME(@Schema) +'.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @Schema AND TABLE_TYPE = 'VIEW' 
ORDER BY TABLE_NAME 

--procedures 
SELECT @Sql = @Sql + 'DROP PROCEDURE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = @Schema AND ROUTINE_TYPE = 'PROCEDURE' 
ORDER BY ROUTINE_NAME 

--functions 
SELECT @Sql = @Sql + 'DROP FUNCTION '+ QUOTENAME(@Schema) +'.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = @Schema AND ROUTINE_TYPE = 'FUNCTION' 
ORDER BY ROUTINE_NAME 

--sequences 
SELECT @Sql = @Sql + 'DROP SEQUENCE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(SEQUENCE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.SEQUENCES 
WHERE SEQUENCE_SCHEMA = @Schema 
ORDER BY SEQUENCE_NAME 

SELECT @Sql = @Sql + 'DROP SCHEMA '+ QUOTENAME(@Schema) + ';' + CHAR(13) 

EXECUTE sp_executesql @Sql 

GO 
+0

câu trả lời hay! –

+0

câu trả lời hay nhất! cảm ơn! –

+1

Đôi khi bạn cũng sẽ phải xóa các kiểu do người dùng xác định. Chúng được tìm thấy với 'SELECT * FROM sys.types trong đó is_user_defined = 1' –

0

xây dựng trên chris LB's answer, tôi đã thêm

GROUP BY d.constraint_object_id, t.name 

vì tôi thấy xóa hạn chế trùng lặp trong truy vấn của tôi. constraint_object_id là FK Hạn chế ID, như đã nói ở https://msdn.microsoft.com/en-us/library/ms186306.aspx

DECLARE @SqlStatement NVARCHAR(MAX), 
     @Schema NVARCHAR(20) 

SET @Schema = 'aa' 

SELECT @SqlStatement = 
    COALESCE(@SqlStatement,'') + 'ALTER TABLE '[email protected]+'.' + t.name + ' DROP CONSTRAINT ' + 
    OBJECT_NAME(d.constraint_object_id) + ';' + CHAR(13) + CHAR(10) 
FROM sys.tables t 
    JOIN sys.foreign_key_columns d on t.object_id = d.parent_object_id 
    INNER JOIN sys.schemas s on t.schema_id = s.schema_id 
WHERE s.name = @Schema 
GROUP BY d.constraint_object_id, t.name 
ORDER BY t.name; 
0

Chỉ trong trường hợp nó giúp ai đó, tôi đã thêm này như một thủ tục lưu trữ cơ sở dữ liệu tổng thể để cho phép nó để sử dụng thuận tiện trên bất kỳ db/schema.

Nó có thể được gọi là như thế này:

EXEC master.dbo.dropTablesInSchema 'my_db', 'dbo 

Thủ tục lưu trữ tạo ra kịch bản:

CREATE PROC [master].[dbo].[dropTablesInSchema] 
    @db nvarchar(max), 
    @schema nvarchar(max) 
AS 
BEGIN 
    DECLARE @Tables TABLE (name nvarchar(max)) 
    INSERT INTO @Tables 
    EXEC ('SELECT TABLE_NAME FROM [' + @db + '].INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ''' + @schema + ''' and TABLE_TYPE =''BASE TABLE''') 

    DECLARE @SqlStatement NVARCHAR(MAX) 
    SELECT @SqlStatement = 
     COALESCE(@SqlStatement, N'') + N'DROP TABLE [' + @db + '].[' + @schema + '].' + QUOTENAME(NAME) + N';' + CHAR(13) 
    FROM @Tables 

    EXEC(@SqlStatement) 

END 
0

Điều này sẽ tạo ra tất cả các DROP TABLE và DROP VIEW với kiểm tra tồn tại.

DECLARE @SqlStatement NVARCHAR(MAX) 

SELECT @SqlStatement = 
COALESCE(@SqlStatement, N'') + N'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'''+'['+TABLE_SCHEMA+'].' + QUOTENAME(TABLE_NAME) +''')' + CHAR(13)+ 
' DROP '+ TABLE_TYPE +' ['+TABLE_SCHEMA+'].' + QUOTENAME(TABLE_NAME) + N';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA in ('SCHEMA1','SCHEMA2','SCHEMA13') 
ORDER BY TABLE_SCHEMA 

PRINT REPLACE(@SqlStatement,'DROP BASE TABLE ','DROP TABLE ') 
GO 
0
select 'DROP TABLE [TABSCHEMA].' + QUOTENAME(TABLE_NAME) + N';' from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TABSCHEMA' and TABLE_TYPE = 'BASE TABLE' 
Các vấn đề liên quan