Как удалить несколько баз данных в SQL Server - PullRequest
21 голосов
/ 25 февраля 2011

Просто чтобы уточнить, на самом деле это не вопрос, а некоторая помощь людям, подобным мне, которые искали ответ.
Многие приложения создают временные таблицы и тому подобное, но я был удивлен, когда Team Foundation Server создал более 80 баз данных на моем тестовом SQL Server. TFS не установился правильно, и любезно предоставил мне возможность разобраться после него. Поскольку каждая база данных имела соглашение об именовании, а не удаляла каждую базу данных вручную, я вспомнил, как использовать курсоры, и написал, как я считаю, самый неразумный кусок T-SQL за всю историю:

   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;

Само собой разумеется, что использование таких курсоров, вероятно, действительно опасно, и его следует использовать с особой осторожностью. Это сработало для меня, и я еще не видел какого-либо дальнейшего повреждения моей базы данных, но я отказываюсь: используйте этот код на свой страх и риск, и сначала сделайте резервную копию ваших важных данных!
Кроме того, если это должно быть удалено, потому что это не вопрос, я понимаю. Просто хотел опубликовать это где-то, где люди будут смотреть.

Ответы [ 2 ]

52 голосов
/ 25 февраля 2011

Почему бы просто не сделать это вместо этого?

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

Захватите результат этого набора результатов и вставьте его в другое окно запроса.Тогда запустите это.Зачем писать весь этот код курсора TSQL?

«Когда у тебя молоток, все выглядит как гвоздь!» ..

23 голосов
/ 09 января 2012

это просто ...

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
...