2011-02-25 14 views
17

Po prostu wyjaśnić, że tak naprawdę nie jest to pytanie, więcej pomocy dla ludzi takich jak ja, którzy szukali odpowiedzi.
Wiele aplikacji tworzy tabele tymczasowe i tym podobne, ale byłem zaskoczony, gdy Team Foundation Server utworzył ponad 80 baz danych na moim testowym serwerze SQL. TFS nie zainstalował się poprawnie i uprzejmie zostawił mnie, abym się po nim rozjaśnił. Ponieważ każda baza danych miała konwencję nazewnictwa, zamiast usuwać każdą bazę danych ręcznie, przypomniałem sobie, jak korzystać z kursorów i napisałem co mi zobaczyć się najbardziej nierozsądne kawałek T-SQL wiekiJak upuścić wiele baz danych w 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; 

Oczywiste powiedzenie, że używanie takich kursorów jest prawdopodobnie niebezpieczne i powinno być używane z dużą ostrożnością. To działało dla mnie i nie widziałem jeszcze żadnych szkód w mojej bazie danych, ale odrzucam: używaj tego kodu na własne ryzyko i najpierw twórz kopie ważnych danych!
Ponadto, jeśli to powinno zostać usunięte, ponieważ to nie jest pytanie, rozumiem. Po prostu chciałem opublikować to, gdzie ludzie będą wyglądać.

+1

Jesteś mogą odpowiedzieć na swoje pytania, więc to może być lepiej aby ponownie wpisać pytanie w rzeczywiste pytanie (spróbuj sformułować je zarówno pod względem twojego szczególnego położenia, jak i ogólnego problemu, który mieści się w nim), a następnie opublikuj scenariusz jako odpowiedź. –

Odpowiedz

20

jest to łatwe ...

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

Nieźle! Będę o tym pamiętać, jeśli będę musiał zrobić to jeszcze raz! :) – Gargravarr

+0

Mała poprawka, porównanie len (@dbnames) powinno być = 0. Przetestowane i działa świetnie. Wystarczy zastąpić wzór w klauzuli podobnej do nazwy bazy danych –

+0

dzięki, naprawiono kod :) – SeriousM

45

Dlaczego nie zrobić tego zamiast tego?

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

Przechwytuj wynik tego zestawu wyników, a następnie wklej go w innym oknie zapytania. Następnie uruchom to. Po co pisać cały ten kod kursora TSQL?

„Kiedy masz młotek, wszystko wygląda jak gwóźdź” ..

+2

To świetne rozwiązanie do ręcznego upuszczania bazy danych. Mam wiele baz danych generowanych podczas testu, a kiedy przerywam testowanie, zwykle kończę z 10-20 bazami danych. Generowanie tego wyniku umożliwia łatwe sprawdzenie, co zostanie usunięte. Proponuję tylko zmodyfikować wyjście do 'SELECT 'DROP DATABASE [' + name + ']'', aby uwzględnić znaki specjalne w nazwach db, co było poprawką, którą musiałem zrobić. – nohwnd

+0

Problem polega na tym, że jeśli nie zamkniesz połączenia przed usunięciem, usunięcie może chwilę potrwać, nawet jeśli nie dbasz o ukończone połączenia. – Tarik

+0

Pożyczę to również, '' Kiedy masz młotek, wszystko wygląda jak gwóźdź! "..' –

Powiązane problemy