2011-02-25 15 views
17

Solo para aclarar, esto no es realmente una pregunta, más ayuda para personas como yo que estaban buscando una respuesta.
Muchas aplicaciones crean tablas temporales y similares, pero me sorprendió cuando Team Foundation Server creó más de 80 bases de datos en mi prueba SQL Server. TFS no se instaló correctamente, y amablemente me dejó para aclarar después de eso. Dado que cada base de datos tenía una convención de nombres, en lugar de borrar cada base de datos a mano, recordé cómo utilizar los cursores y han escrito lo que ven ser la pieza más prudente de T-SQL nunca:Cómo descartar varias bases de datos en 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; 

Huelga diciendo que el uso de cursores como este es probablemente muy peligroso y debe usarse con extrema precaución. Esto funcionó para mí, y aún no he visto ningún daño adicional en mi base de datos, pero rechazo: use este código bajo su responsabilidad, ¡y haga una copia de seguridad de sus datos vitales primero!
Además, si esto se debe eliminar porque no es una pregunta, lo entiendo. Solo quería publicar esto en algún lugar donde las personas pudieran ver.

+1

se le permite responder a sus propias preguntas, por lo que podría ser mejor para volver a escribir la pregunta en una pregunta real (trate de expresarla tanto en términos de su problema particular como del problema general que encaja), luego publique el guión como una respuesta. –

Respuesta

20

esto es fácil ...

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

¡Nada mal! Tendré esto en cuenta si alguna vez tengo que hacer esto de nuevo. :) – Gargravarr

+0

Pequeña corrección, la comparación len (@dbnames) debería ser = 0. Lo probó y funciona muy bien. Simplemente reemplace el patrón en la cláusula similar a los nombres de su base de datos –

+0

gracias, corrigió el código :) – SeriousM

45

¿Por qué no hacer esto en su lugar?

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

Capture el resultado de ese conjunto de resultados y luego péguelo en otra ventana de consulta. Entonces ejecuta eso. ¿Por qué escribir todo este código de cursor TSQL?

"Cuando se tiene un martillo, todo parece un clavo!" ..

+2

Esta es una gran solución para la caída manual de la base de datos. Tengo muchas bases de datos generadas durante la prueba, y cuando aborto la prueba, generalmente termino con 10-20 bases de datos. Generar este resultado me permite revisar fácilmente lo que se descartará. Solo sugeriría modificar la salida para 'SELECCIONAR' DROP DATABASE ['+ name +'] ''para tener en cuenta los caracteres especiales en los nombres db, que era una solución que tenía que hacer. – nohwnd

+0

El problema con esto es que si no cierra la conexión antes de la eliminación, la eliminación puede demorar un tiempo aunque no le importen las conexiones completadas. – Tarik

+0

Voy a pedir prestado esto también, '' Cuando tienes un martillo, todo parece un clavo! "..' –

Cuestiones relacionadas