2011-02-25 41 views
17

Chỉ cần làm rõ, ths không thực sự là một câu hỏi, thêm một số trợ giúp cho những người như tôi, những người đang tìm kiếm câu trả lời.
Rất nhiều ứng dụng tạo ra các bảng tạm thời và tương tự, nhưng tôi đã rất ngạc nhiên khi Team Foundation Server tạo ra hơn 80 cơ sở dữ liệu trên máy chủ SQL thử nghiệm của tôi. TFS đã không cài đặt đúng, và vui lòng để tôi dọn dẹp sau nó. Vì mỗi cơ sở dữ liệu đã có một quy ước đặt tên, chứ không phải xóa từng cơ sở dữ liệu bằng tay, tôi nhớ cách sử dụng con trỏ và đã viết những gì tôi xem là mảnh khôn ngoan nhất của T-SQL bao giờ hết:Làm thế nào để thả nhiều cơ sở dữ liệu trong SQL Server

CREATE TABLE #databaseNames (name varchar(100) NOT NULL, db_size varchar(50), owner varchar(50), dbid int, created date, status text, compatibility_level int); 
INSERT #databaseNames 
    exec sp_helpdb; 

DECLARE dropCur CURSOR FOR 
    SELECT name FROM #databaseNames WHERE name like '_database_name_%'; 
OPEN dropCur; 
DECLARE @dbName nvarchar(100); 
FETCH NEXT FROM dropCur INTO @dbName; 
DECLARE @statement nvarchar(200); 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @statement = 'DROP DATABASE ' + @dbName; 
    EXEC sp_executesql @statement; 
    FETCH NEXT FROM dropCur INTO @dbName; 
END 
CLOSE dropCur; 
DEALLOCATE dropCur; 
DROP TABLE #databaseNames; 

Nó đi mà không nói rằng sử dụng con trỏ như thế này có lẽ thực sự nguy hiểm, và nên được sử dụng hết sức thận trọng. Điều này làm việc cho tôi và tôi chưa thấy thêm bất kỳ thiệt hại nào cho cơ sở dữ liệu của mình, nhưng tôi từ chối: sử dụng mã này có nguy cơ của riêng bạn và sao lưu dữ liệu quan trọng của bạn trước tiên!
Ngoài ra, nếu điều này sẽ bị xóa vì nó không phải là một câu hỏi, tôi hiểu. Chỉ muốn đăng bài này ở đâu đó mọi người sẽ xem xét.

+1

Bạn được phép để trả lời câu hỏi của riêng bạn, vì vậy nó có thể là tốt hơn để viết lại câu hỏi vào một câu hỏi thực tế (cố gắng cụm từ nó cả về tình trạng khó khăn cụ thể của bạn, và vấn đề chung nó phù hợp), sau đó đăng kịch bản như một câu trả lời. –

Trả lời

20

này rất dễ dàng ...

use master 
go 
declare @dbnames nvarchar(max) 
declare @statement nvarchar(max) 
set @dbnames = '' 
set @statement = '' 
select @dbnames = @dbnames + ',[' + name + ']' from sys.databases where name like 'name.of.db%' 
if len(@dbnames) = 0 
    begin 
    print 'no databases to drop' 
    end 
else 
    begin 
    set @statement = 'drop database ' + substring(@dbnames, 2, len(@dbnames)) 
    print @statement 
    exec sp_executesql @statement 
    end 
+0

Không tệ! Tôi sẽ ghi nhớ điều này nếu tôi phải làm điều này một lần nữa! :) – Gargravarr

+0

Chỉnh sửa nhỏ, so sánh len (@dbnames) nên được = 0. Thử nghiệm nó và nó hoạt động tuyệt vời. Chỉ cần thay thế mẫu trong mệnh đề tương tự như tên cơ sở dữ liệu của bạn –

+0

cảm ơn, đã sửa mã :) – SeriousM

45

Tại sao không chỉ thực hiện việc này thay thế?

USE master; 
Go 
SELECT 'DROP DATABASE '+ name 
FROM sys.databases WHERE name like '_database_name_%'; 
GO 

Ghi lại kết quả của kết quả đó rồi dán vào cửa sổ truy vấn khác. Sau đó chạy nó. Tại sao viết tất cả mã con trỏ TSQL này?

"Khi bạn có một cái búa, mọi thứ trông giống như một cái đinh!" ..

+2

Đây là một giải pháp tuyệt vời cho việc giảm cơ sở dữ liệu thủ công. Tôi có rất nhiều cơ sở dữ liệu được tạo ra trong quá trình thử nghiệm và khi tôi bỏ chạy thử nghiệm, tôi thường kết thúc với 10-20 cơ sở dữ liệu. Việc tạo đầu ra này cho phép tôi dễ dàng xem lại những gì sẽ bị loại bỏ. Tôi sẽ chỉ đề nghị sửa đổi đầu ra thành 'SELECT' DROP DATABASE ['+ name +'] ''để lấy các ký tự đặc biệt trong các tên db vào tài khoản, đó là một sửa chữa mà tôi cần phải làm. – nohwnd

+0

Vấn đề với điều này là nếu bạn không đóng kết nối trước khi xóa, việc xóa có thể mất một lúc mặc dù bạn có thể không quan tâm đến các kết nối đã hoàn tất. – Tarik

+0

Tôi cũng sẽ mượn cái này, "Khi bạn có một cái búa, mọi thứ trông giống như một cái đinh!" .. ' –

Các vấn đề liên quan