This proc comes in handy when you have to purge all the
objects in your database, so you can then run a creation script. It will tell you how many objects it dropped.
Use Admin
GO
IF
Object_ID('dbo.DropObjectsInSchema')
Is Not Null
DROP PROC dbo.DropObjectsInSchema
go
CREATE PROC dbo.DropObjectsInSchema
@SchemaName varchar(50),
@ObjectType varchar(50),
@Debug bit = 0
AS
/* DATE AUTHOR REMARKS
11/11/13 PPaiva Initial
creation.
DESCRIPTION
Drops
all objects of type @ObjectType in a given schema.
USAGE
Exec
DropObjectsInSchema 'dbo', 'FK', 1
Exec
DropObjectsInSchema 'dbo', 'Table', 1
Exec
DropObjectsInSchema 'dbo', 'View', 1
Exec
DropObjectsInSchema 'dbo', 'Proc', 1
Exec
DropObjectsInSchema 'dbo', 'Function', 1
DropObjectsInSchema
'dbo', 'FK', 1
DropObjectsInSchema
'dbo', 'FK'
DropObjectsInSchema
'dbo', 'Table', 1
DropObjectsInSchema
'dbo', 'Table'
DropObjectsInSchema
'dbo', 'View', 1
DropObjectsInSchema
'dbo', 'View'
DropObjectsInSchema
'dbo', 'Proc', 1
DropObjectsInSchema
'dbo', 'Proc'
DropObjectsInSchema
'dbo', 'Function', 1
DropObjectsInSchema
'dbo', 'Function'
DEBUG
SELECT
*
FROM
sys.schemas
WHERE
Name Not Like 'db_%'
SELECT
type_desc, Count(*) Qty
FROM
sys.objects
GROUP
BY type_desc
ORDER
BY 1
SELECT
*
FROM
sys.objects
WHERE
type_desc <> 'system_table'
SELECT
*
FROM
vwDictCol
*/
SET NOCOUNT ON
DECLARE @Name varchar(100),
@MaxName varchar(100),
@Sql varchar(1000),
@Num int,
@Msg varchar(100)
IF
@ObjectType Not
In ( 'FK', 'Table', 'View', 'Proc', 'Function')
BEGIN
SET @Msg = '@ObjectType must be one of
these: FK, Table, View, Proc, Function'
Print @Msg
RaisError (@Msg, 16, 1)
RETURN
END
CREATE TABLE #t(
ID int NOT NULL IDENTITY(1, 1),
Name sysname,
Sql varchar(2000)
)
IF
@ObjectType = 'FK'
INSERT INTO #t (Name, Sql)
SELECT f.Name,
'ALTER TABLE [' + SCHEMA_NAME(o.schema_id) + '].[' + object_Name(f.parent_object_id) + ']'
+ ' DROP CONSTRAINT ['
+ f.name + ']' Sql
FROM sys.foreign_keys f
JOIN sys.objects o
ON o.object_id = f.parent_object_id
WHERE SCHEMA_NAME(o.schema_id) = @SchemaName
ORDER BY o.Name
ELSE IF @ObjectType
= 'Table'
INSERT INTO #t (Name, Sql)
SELECT o.Name,
'DROP TABLE [' + SCHEMA_NAME(o.schema_id) + '].[' + o.name + ']' Sql
FROM sys.objects o
WHERE type_desc = 'user_table'
AND SCHEMA_NAME(o.schema_id) = @SchemaName
AND o.Name Not In ('sysdiagrams', 'Flag', 'logEvent', 'History')
AND o.Name Not Like 'rsa%'
ORDER BY o.Name
ELSE IF @ObjectType
= 'View'
INSERT INTO #t (Name, Sql)
SELECT o.Name,
'DROP VIEW [' + SCHEMA_NAME(o.schema_id) + '].[' + o.name + ']' Sql
FROM sys.objects o
WHERE type_desc = 'View'
AND SCHEMA_NAME(o.schema_id) = @SchemaName
AND o.Name Not In ('vwDictCol', 'vwIndexRaw', 'vwRowCount', 'vwTrigger')
ORDER BY o.Name
ELSE IF @ObjectType
= 'Proc'
INSERT INTO #t (Name, Sql)
SELECT o.Name,
'DROP PROC [' + SCHEMA_NAME(o.schema_id) + '].[' + o.name + ']' Sql
FROM sys.objects o
WHERE type_desc Like '%procedure%'
AND SCHEMA_NAME(o.schema_id) = @SchemaName
AND o.Name Not Like 'sp%diagram%'
AND o.name Not In ( 'DropObjectsInSchema', 'WriteLogEvent')
ORDER BY o.Name
ELSE IF @ObjectType
= 'Function'
INSERT INTO #t (Name, Sql)
SELECT o.Name,
'DROP FUNCTION [' + SCHEMA_NAME(o.schema_id) + '].[' + o.name + ']' Sql
FROM sys.objects o
WHERE type_desc Like '%function%'
AND SCHEMA_NAME(o.schema_id) = @SchemaName
AND o.Name Not In ('fn_diagramobjects', 'udfFormatInteger', 'udfGetColumnList', 'udfGetEntityRoleId', 'udfFormatTimeWithColons')
ORDER BY o.Name
SELECT @MaxName
= Max(Name),
@Name = '',
@Num = Count(*)
FROM #t
SET @Msg =
@ObjectType + 's found in schema ' +
@SchemaName + ': ' + Convert(varchar, @Num)
Print ''
Print @Msg
WHILE @Name <
@MaxName
BEGIN
-- Get next Name
SELECT @Name = Min(Name)
FROM #t
WHERE Name > @Name
-- Get other attibutes
SELECT @Sql = Sql
FROM #t
WHERE Name = @Name
IF @Debug = 1
Print @Sql
ELSE
Exec (@Sql)
END
No comments:
Post a Comment