2012-01-19 10 views

Respuesta

75

Esto generará todas las sentencias DROP TABLE para usted e imprimir la instrucción SQL a cabo. Luego puede validar que es lo que espera antes de copiar y ejecutar. Sólo asegúrese de que esté 100% seguro ... tal vez tomar una copia de seguridad primero :)

DECLARE @SqlStatement NVARCHAR(MAX) 
SELECT @SqlStatement = 
    COALESCE(@SqlStatement, N'') + N'DROP TABLE [DBO1].' + QUOTENAME(TABLE_NAME) + N';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'DBO1' and TABLE_TYPE = 'BASE TABLE' 

PRINT @SqlStatement 
+6

Y si realmente ** ** querían hacerlo de una sola vez, podrían exec (o sp_executesql ejecutivo) @SqlStatement al final. – DaveShaw

+0

no funcionará si su base de datos tiene alguna restricción en absoluto – ladieu

+0

@ladieu - ¿qué le hace decir eso? Funciona si tienes restricciones ... – AdaTheDev

25

hilo Algo viejo lo sé, pero yo estaba buscando algo como esto y encontré la respuesta original, muy útil. Dicho esto, la secuencia de comandos también intentará eliminar las vistas que puedan existir en ese esquema y le dará un mensaje de error porque terminará tratando de descartar una vista emitiendo una instrucción DROP TABLE.

Terminé escribiendo esto porque necesitaba eliminar todas las tablas, vistas, procedimientos y funciones de un esquema dado. Tal vez no sea la manera más elegante de lograr esto, pero funcionó para mí y pensé que lo compartiría.

DECLARE @Sql VARCHAR(MAX) 
     , @Schema varchar(20) 

SET @Schema = 'Integration' --put your schema name between these quotes 

--tables 
SELECT @Sql = COALESCE(@Sql,'') + 'DROP TABLE %SCHEMA%.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @Schema 
    AND TABLE_TYPE = 'BASE TABLE' 
ORDER BY TABLE_NAME 


--views 
SELECT @Sql = COALESCE(@Sql,'') + 'DROP VIEW %SCHEMA%.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @Schema 
    AND TABLE_TYPE = 'VIEW' 
ORDER BY TABLE_NAME 

--Procedures 
SELECT @Sql = COALESCE(@Sql,'') + 'DROP PROCEDURE %SCHEMA%.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = @Schema 
    AND ROUTINE_TYPE = 'PROCEDURE' 
ORDER BY ROUTINE_NAME 

--Functions 
SELECT @Sql = COALESCE(@Sql,'') + 'DROP FUNCTION %SCHEMA%.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = @Schema 
    AND ROUTINE_TYPE = 'FUNCTION' 
ORDER BY ROUTINE_NAME 


SELECT @Sql = COALESCE(REPLACE(@Sql,'%SCHEMA%',@Schema), '') 

PRINT @Sql 
12

Sobre la base de la respuesta de @ Kevo, he añadido lo siguiente para dejar caer todas las restricciones de clave externa antes de eliminar las tablas. Sólo he probado en SQL2008 R2

select @Sql = COALESCE(@Sql,'') + 'ALTER TABLE %SCHEMA%.' + t.name + ' drop constraint ' + 
OBJECT_NAME(d.constraint_object_id) + ';' + CHAR(13) 
from sys.tables t 
    join sys.foreign_key_columns d on d.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id 
where s.name = @Schema 
ORDER BY t.name; 
7

también sobre la base de la respuesta de @ Kevo, que añade el siguiente bucle while para un problema que estaba teniendo con la declaración TSQL impresión. Una cadena de mensaje puede tener hasta 8,000 caracteres de longitud. Si es mayor a 8,000, la instrucción de impresión truncará los caracteres restantes.

DECLARE @SqlLength int 
     , @SqlPosition int = 1 
     , @printMaxLength int = 8000 

SET @SqlLength = LEN(@Sql) 

WHILE (@SqlLength) > @printMaxLength 
BEGIN 
    PRINT SUBSTRING(@Sql, @SqlPosition, @printMaxLength) 
    SET @SqlLength = @SqlLength - @printMaxLength 
    SET @SqlPosition = @SqlPosition + @printMaxLength 
END 
IF (@SqlLength) < @printMaxLength AND (@SqlLength) > 0 
BEGIN 
    PRINT SUBSTRING(@Sql, @SqlPosition, @printMaxLength) 
END 
1

Combiné las respuestas de @ raider33 y @Kevo a una solución para la ejecución directa.

DECLARE @SqlStatement NVARCHAR(MAX) 
DECLARE @schema varchar(30) = 'SCHEMA_NAME'; 

select @SqlStatement = COALESCE(@SqlStatement,'') + 'ALTER TABLE '[email protected]+'.' + t.name + ' drop constraint ' + 
OBJECT_NAME(d.constraint_object_id) + ';' + CHAR(13) + CHAR(10) 
from sys.tables t 
    join sys.foreign_key_columns d on d.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id 
where s.name = @schema 
ORDER BY t.name; 

SELECT @SqlStatement += 
    COALESCE(@SqlStatement, '') + 'DROP TABLE ' + @schema +'.'+ QUOTENAME(TABLE_NAME) + ';' + CHAR(13) + CHAR(10) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @schema 

EXECUTE sp_executesql @SqlStatement 
9

Sobre la base de las otras respuestas, aquí es un procedimiento almacenado spDropSchema que cae todos los objetos en un esquema y el mismo esquema.

Tenga en cuenta que el procedimiento intenta soltar objetos de secuencia también, por lo que solo funcionará en SQL Server 2012 y posteriores.

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'spDropSchema') 
    BEGIN 
     DROP PROCEDURE spDropSchema 
    END 
GO 

CREATE PROCEDURE spDropSchema(@Schema nvarchar(200)) 
AS 

DECLARE @Sql NVARCHAR(MAX) = ''; 

--constraints 
SELECT @Sql = @Sql + 'ALTER TABLE '+ QUOTENAME(@Schema) + '.' + QUOTENAME(t.name) + ' DROP CONSTRAINT ' + QUOTENAME(f.name) + ';' + CHAR(13) 
FROM sys.tables t 
    inner join sys.foreign_keys f on f.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id 
WHERE s.name = @Schema 
ORDER BY t.name; 

--tables 
SELECT @Sql = @Sql + 'DROP TABLE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @Schema AND TABLE_TYPE = 'BASE TABLE' 
ORDER BY TABLE_NAME 

--views 
SELECT @Sql = @Sql + 'DROP VIEW '+ QUOTENAME(@Schema) +'.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @Schema AND TABLE_TYPE = 'VIEW' 
ORDER BY TABLE_NAME 

--procedures 
SELECT @Sql = @Sql + 'DROP PROCEDURE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = @Schema AND ROUTINE_TYPE = 'PROCEDURE' 
ORDER BY ROUTINE_NAME 

--functions 
SELECT @Sql = @Sql + 'DROP FUNCTION '+ QUOTENAME(@Schema) +'.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = @Schema AND ROUTINE_TYPE = 'FUNCTION' 
ORDER BY ROUTINE_NAME 

--sequences 
SELECT @Sql = @Sql + 'DROP SEQUENCE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(SEQUENCE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.SEQUENCES 
WHERE SEQUENCE_SCHEMA = @Schema 
ORDER BY SEQUENCE_NAME 

SELECT @Sql = @Sql + 'DROP SCHEMA '+ QUOTENAME(@Schema) + ';' + CHAR(13) 

EXECUTE sp_executesql @Sql 

GO 
+0

¡¡¡buena respuesta !!! –

+0

mejor respuesta! ¡Gracias! –

+1

A veces deberá eliminar los tipos definidos por el usuario también. Se encuentran con 'SELECT * FROM sys.types donde is_user_defined = 1' –

0

Basándose en chris LB's answer, he añadido

GROUP BY d.constraint_object_id, t.name 

porque vi supresiones de restricción duplicados en mi consulta. constraint_object_id es el FK Restricción de identificación, como se ha señalado en https://msdn.microsoft.com/en-us/library/ms186306.aspx

DECLARE @SqlStatement NVARCHAR(MAX), 
     @Schema NVARCHAR(20) 

SET @Schema = 'aa' 

SELECT @SqlStatement = 
    COALESCE(@SqlStatement,'') + 'ALTER TABLE '[email protected]+'.' + t.name + ' DROP CONSTRAINT ' + 
    OBJECT_NAME(d.constraint_object_id) + ';' + CHAR(13) + CHAR(10) 
FROM sys.tables t 
    JOIN sys.foreign_key_columns d on t.object_id = d.parent_object_id 
    INNER JOIN sys.schemas s on t.schema_id = s.schema_id 
WHERE s.name = @Schema 
GROUP BY d.constraint_object_id, t.name 
ORDER BY t.name; 
0

Sólo en caso de que ayuda a alguien, he añadido esto como un procedimiento almacenado en la base de datos maestra para que pueda utilizarse convenientemente en cualquier db/esquema.

se le puede llamar así:

EXEC master.dbo.dropTablesInSchema 'my_db', 'dbo 

Procedimiento almacenado script de creación:

CREATE PROC [master].[dbo].[dropTablesInSchema] 
    @db nvarchar(max), 
    @schema nvarchar(max) 
AS 
BEGIN 
    DECLARE @Tables TABLE (name nvarchar(max)) 
    INSERT INTO @Tables 
    EXEC ('SELECT TABLE_NAME FROM [' + @db + '].INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ''' + @schema + ''' and TABLE_TYPE =''BASE TABLE''') 

    DECLARE @SqlStatement NVARCHAR(MAX) 
    SELECT @SqlStatement = 
     COALESCE(@SqlStatement, N'') + N'DROP TABLE [' + @db + '].[' + @schema + '].' + QUOTENAME(NAME) + N';' + CHAR(13) 
    FROM @Tables 

    EXEC(@SqlStatement) 

END 
0

Esto generará todo el DROP TABLE y DROP VIEW con cheque existe.

DECLARE @SqlStatement NVARCHAR(MAX) 

SELECT @SqlStatement = 
COALESCE(@SqlStatement, N'') + N'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'''+'['+TABLE_SCHEMA+'].' + QUOTENAME(TABLE_NAME) +''')' + CHAR(13)+ 
' DROP '+ TABLE_TYPE +' ['+TABLE_SCHEMA+'].' + QUOTENAME(TABLE_NAME) + N';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA in ('SCHEMA1','SCHEMA2','SCHEMA13') 
ORDER BY TABLE_SCHEMA 

PRINT REPLACE(@SqlStatement,'DROP BASE TABLE ','DROP TABLE ') 
GO 
0
select 'DROP TABLE [TABSCHEMA].' + QUOTENAME(TABLE_NAME) + N';' from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TABSCHEMA' and TABLE_TYPE = 'BASE TABLE' 
Cuestiones relacionadas