2012-01-19 10 views

risposta

75

Questo genererà tutte le dichiarazioni GOCCIA tavolo per voi e stampare l'istruzione SQL fuori. Puoi quindi convalidare ciò che ti aspetti prima di copiare ed eseguire. Basta fare in modo si è sicuri al 100% ... magari fare un backup prima :)

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

E se davvero ** ** voluto farlo in un colpo solo, hanno potuto exec (o sp_executesql exec) @SqlStatement alla fine. – DaveShaw

+0

non funzionerà se il tuo database ha dei vincoli a tutti – ladieu

+0

@ladieu - cosa te lo dice? Funziona se si dispone di vincoli ... – AdaTheDev

25

un po 'vecchio filo lo so, ma ero alla ricerca di qualcosa di simile e ho trovato la risposta originale molto utile. Detto questo, lo script tenterà anche di rilasciare le viste che potrebbero esistere in quello schema e fornirà un messaggio di errore perché si finisce per tentare di rilasciare una vista emettendo un'istruzione DROP TABLE.

Ho finito per scrivere questo perché avevo bisogno di eliminare tutte le tabelle, le viste, le procedure e le funzioni da un dato schema. Forse non è il modo più elegante per farlo, ma ha funzionato per me e ho pensato di condividerlo.

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

Sulla @ risposta di Kevo, ho aggiunto quanto segue per far cadere tutti i vincoli di chiave esterna prima di eliminare le tabelle. Ho provato solo su 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

anche sulla base @ risposta di Kevo, ho aggiunto il seguente ciclo while per una questione che stava avendo con la dichiarazione TSQL stampa. Una stringa di messaggi può avere una lunghezza massima di 8000 caratteri. Se superiore a 8.000 l'istruzione di stampa troncerà i caratteri rimanenti.

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

Ho combinato le risposte da @ raider33 e @Kevo a una soluzione per l'esecuzione diretta.

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

Sulla base delle altre risposte, ecco un stored procedure spDropSchema che cade tutti gli oggetti in uno schema e lo schema stesso.

Si noti che la procedura tenta di eliminare anche oggetti sequenza, pertanto funzionerà solo su SQL Server 2012 e versioni successive.

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

bella risposta !!! –

+0

risposta migliore! Grazie! –

+1

A volte è necessario eliminare anche i tipi definiti dall'utente. Si trovano con 'SELECT * FROM sys.types dove is_user_defined = 1' –

0

Sulla chris LB's answer, ho aggiunto

GROUP BY d.constraint_object_id, t.name 

perché ho visto le eliminazioni di vincoli duplicati nella mia interrogazione. constraint_object_id è l'FK Vincolo ID, come rilevato al 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

Solo nel caso si aiuta qualcuno, ho aggiunto questo come una stored procedure per il database master per permettergli di utilizzare comodamente su qualsiasi db/schema.

può essere chiamato in questo modo:

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

stored procedure creare script:

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

Questo genererà tutto il DROP TABLE e DROP VIEW con esiste controllo.

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' 
Problemi correlati