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
E se davvero ** ** voluto farlo in un colpo solo, hanno potuto exec (o sp_executesql exec) @SqlStatement alla fine. – DaveShaw
non funzionerà se il tuo database ha dei vincoli a tutti – ladieu
@ladieu - cosa te lo dice? Funziona se si dispone di vincoli ... – AdaTheDev