2011-02-25 2 views
17

명확히하기 위해 질문은 사실 질문이 아니며 답을 찾고있는 나 같은 사람들에게 도움이됩니다.
많은 응용 프로그램이 임시 테이블 등을 만들었지 만 Team Foundation Server가 테스트 용 SQL Server에 80 개 이상의 데이터베이스를 만들었을 때 놀랐습니다. TFS가 올바르게 설치되지 않았고, 친절하게도 나중에 TFS를 정리해 둡니다.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; 

그것은없이 간다 : 각 데이터베이스가 명명 규칙을 가지고 있기 때문에, 손으로 각 데이터베이스를 삭제하는 대신, 나는 내가 T-SQL의 가장 현명하지 못한 부분으로 볼 무엇 커서를 사용하고 쓴 어떻게 기억 이처럼 커서를 사용하는 것은 매우 위험 할 수 있으므로 극도의주의를 기울여 사용해야합니다. 이 작업은 저에게 효과적이었고 데이터베이스에 대한 추가 손상은 아직 보지 못했습니다. 그러나이 코드를 사용하여 위험을 감수하고 중요 데이터를 먼저 백업하십시오!
또한 질문이 아니기 때문에 삭제해야한다면 이해합니다. 사람들이 보게 될 어딘가에 게시하고 싶었습니다.

+1

당신은 당신의 자신의 질문에 대답 할 수 있습니다 .. "당신은 망치가있을 때, 모든! 못처럼 보인다", 그래서 더 좋을 수도 질문을 실제 질문에 다시 써 넣으십시오 (귀하의 특정 곤경과 그 안에 들어있는 일반적인 문제 둘 다로 말하십시오). 그런 다음 스크립트를 대답으로 게시하십시오. –

답변

20

이 쉽다는 ...

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

나쁘지 않습니다! 나가 이것을 다시해야하는 경우에 나는 이것을 명심 할 것이다! :) – Gargravarr

+0

작은 수정, len (@dbnames) 비교는 = 0이어야합니다. 테스트를 거쳐 훌륭하게 작동합니다. 그냥 데이터베이스의 이름을 같은 절에 패턴을 바꿉니다 –

+0

덕분에, 수정 코드 :) – SeriousM

45

대신 왜이 작업을 수행하지 않습니까?

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

결과 집합을 캡쳐 한 다음 다른 쿼리 창에 붙여 넣습니다. 그런 다음 실행하십시오. 왜이 TSQL 커서 코드를 모두 작성합니까?

+2

이것은 수동 데이터베이스 삭제를위한 훌륭한 솔루션입니다. 테스트 중에 생성 된 데이터베이스가 많습니다. 테스트 실행을 중단하면 일반적으로 10-20 개의 데이터베이스로 끝납니다. 이 출력을 생성하면 무엇이 삭제되는지 쉽게 검토 할 수 있습니다. 나는 출력을'SELECT 'DROP DATABASE ['+ name + ']''로 수정하여 DB 이름의 특수 문자를 고려해야 할 수정안을 제안했다. – nohwnd

+0

이 문제는 삭제하기 전에 연결을 닫지 않으면 완료된 연결을 신경 쓸 필요가 없더라도 삭제가 오래 걸릴 수 있다는 것입니다. – Tarik

+0

나는 이것을 빌릴 것이다. ""망치가 있으면, 모든 것이 손톱처럼 보입니다! "" –