T-SQL: Drop All Objects in a SQL Server Database

Sometimes you want to clear out a database, but you can't just drop the entire database and create a new one. Recently, a colleague needed to do just that, but couldn't because the database was hosted elsewhere. Here is a simple script that works to drop all objects in any database I've tested it against so far. If your database contains object types that mine don't, you might need to add to this script using the same patterns established here.

declare @stmt nvarchar(max)
 
-- procedures
select top 1 @stmt = isnull( @stmt + '
', '' ) + 'drop procedure ' + quotename(schema_name(schema_id)) + '.' + quotename(name)
from sys.procedures
 
-- check constraints
select top 1 @stmt = isnull( @stmt + '
', '' ) + 'alter table ' + quotename(schema_name(schema_id)) + '.' + quotename(object_name( parent_object_id )) + ' drop constraint ' + quotename(name)
from sys.check_constraints
 
-- functions
select top 1 @stmt = isnull( @stmt + '
', '' ) + 'drop function ' + quotename(schema_name(schema_id)) + '.' + quotename(name)
from sys.objects
where type in ( 'FN', 'IF', 'TF' )
 
-- views
select top 1 @stmt = isnull( @stmt + '
', '' ) + 'drop view ' + quotename(schema_name(schema_id)) + '.' + quotename(name)
from sys.views
 
-- foreign keys
select top 1 @stmt = isnull( @stmt + '
', '' ) + 'alter table ' + quotename(schema_name(schema_id)) + '.' + quotename(object_name( parent_object_id )) + ' drop constraint ' + quotename(name)
from sys.foreign_keys
 
-- tables
select top 1 @stmt = isnull( @stmt + '
', '' ) + 'drop table ' + quotename(schema_name(schema_id)) + '.' + quotename(name)
from sys.tables
 
-- user defined types
select top 1 @stmt = isnull( @stmt + '
', '' ) + 'drop type ' + quotename(schema_name(schema_id)) + '.' + quotename(name)
from sys.types
where is_user_defined = 1
 
-- schemas
select @stmt = isnull( @stmt + '
', '' ) + 'drop schema ' + quotename(name)
from sys.schemas
where principal_id <> schema_id
 
exec sp_executesql @stmt
comments powered by Disqus

Get weekly updates in your inbox!