Xin chào Tôi muốn biết là có thể thả tất cả các bảng trong cơ sở dữ liệu được tạo trong lược đồ tùy chỉnh ví dụ DBO1 ... với một truy vấn sql hoặc tập lệnh đặc biệt.SQL Server 2008 xóa tất cả các bảng theo lược đồ đặc biệt
Cảm ơn
Xin chào Tôi muốn biết là có thể thả tất cả các bảng trong cơ sở dữ liệu được tạo trong lược đồ tùy chỉnh ví dụ DBO1 ... với một truy vấn sql hoặc tập lệnh đặc biệt.SQL Server 2008 xóa tất cả các bảng theo lược đồ đặc biệt
Cảm ơn
Đ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
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
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;
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
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
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
câu trả lời hay! –
câu trả lời hay nhất! cảm ơn! –
Đô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' –
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;
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
Đ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
select 'DROP TABLE [TABSCHEMA].' + QUOTENAME(TABLE_NAME) + N';' from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TABSCHEMA' and TABLE_TYPE = 'BASE TABLE'
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
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
@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