El script SQL compartido en esta página es la versión #2 de algo que ya se había publicado en este enlace en Septiembre/2020.
La diferencia básicamente es que esta versión #2 elimina TODOS LOS OBJETOS de la base de datos -exceptuando la tabla y procedimientos que MSSQL pone cuando se crean diagramas de la base de datos- sin pedir confirmación alguna.
MUY IMPORTANTE
Este sitio web y el autor de esta nota no se hace responsable de los resultados obtenidos por la mala ejecución de este script.
Texto coloreado utilizando [ tohtml.com ] | Descargar archivo |
-- SSI base de datos en uso es distinta a "master" => Se ejecutarán los comandos de eliminación de objetos use [master]; go -- Inicialización de variables declare @n int, @i int, @XSQL varchar(max), @stk varchar(max); declare @tProtectedObject table (OBJ_NAME varchar(300)); declare @tSQL table ( ROWID int identity (1, 1) not null, GROUP_NUMBER int not null, XSQL varchar(max)) set nocount on; set @stk = char(13) + replicate('*', 75) + char(13); -- Se muestra cantidad de objetos por tipo que existen select type, type_desc, COUNT(*) as CANTIDAD_ANTES from sys.objects group by type, type_desc order by 1, 2; -- Se ponen en tabla [@tProtectedObject] lista de objetos que no se deberán eliminar insert into @tProtectedObject (OBJ_NAME) values ('sysdiagrams'), ('sp_alterdiagram'), ('sp_creatediagram'), ('sp_dropdiagram'), ('sp_helpdiagramdefinition'), ('sp_helpdiagrams'), ('sp_renamediagram'), ('sp_upgraddiagrams'), ('fn_diagramobjects'); -- Se ponen en table [@tSQL] los comandos para eliminar llaves foráneas, funciones, procedimientos, vistas y tablas insert into @tSQL (GROUP_NUMBER, XSQL) -- Eliminación de llaves foráneas select 10 as GROUP_NUMBER, 'alter table [' + e.name + '].[' + c.name + '] drop constraint [' + b.name + '];' as XSQL from sys.objects a inner join sys.foreign_keys b on b.referenced_object_id = a.object_id inner join sys.objects c on c.object_id = b.parent_object_id inner join sys.schemas d on d.schema_id = a.schema_id inner join sys.schemas e on e.schema_id = c.schema_id left outer join @tProtectedObject po on po.OBJ_NAME = a.[name] left outer join @tProtectedObject po2 on po2.OBJ_NAME = c.[name] where po.OBJ_NAME is null and po2.OBJ_NAME is null union -- Eliminación de funciones, procedimientos, vistas y tablas select a.GROUP_NUMBER, 'drop ' + lower(a.OBJ_TYPE) + ' [' + a.OBJ_SCHEMA + '].[' + a.OBJ_NAME + ']' as XSQL from ( -- Eliminación de funciones select 70 as GROUP_NUMBER, 'FUNCTION' as OBJ_TYPE, b.[name] as OBJ_SCHEMA, a.name as OBJ_NAME from sys.objects a inner join sys.schemas b on b.[schema_id] = a.[schema_id] left outer join @tProtectedObject po on po.OBJ_NAME = a.[name] where a.type in ('fn', 'TF') and po.OBJ_NAME is null union -- Eliminación de procedimientos select 80 as GROUP_NUMBER, 'PROCEDURE' as OBJ_TYPE, b.[name] as OBJ_SCHEMA, a.name as OBJ_NAME from sys.objects a inner join sys.schemas b on b.[schema_id] = a.[schema_id] left outer join @tProtectedObject po on po.OBJ_NAME = a.[name] where a.type in ('p') and po.OBJ_NAME is null union -- Elimiación de vistas select 90 as GROUP_NUMBER, 'VIEW' as OBJ_TYPE, b.[name] as OBJ_SCHEMA, a.name as OBJ_NAME from sys.objects a inner join sys.schemas b on b.[schema_id] = a.[schema_id] left outer join @tProtectedObject po on po.OBJ_NAME = a.[name] where a.type in ('v') and po.OBJ_NAME is null union -- Eliminación de tablas select 100 as GROUP_NUMBER, 'TABLE' as OBJ_TYPE, b.[name] as OBJ_SCHEMA, a.name as OBJ_NAME from sys.objects a inner join sys.schemas b on b.[schema_id] = a.[schema_id] left outer join @tProtectedObject po on po.OBJ_NAME = a.[name] where a.type in ('u') and po.OBJ_NAME is null ) a order by 1, 2; -- Ejecución de comandos de eliminación de objetos if ((db_name() = 'master')) print @stk + 'No se ejecutarán los comandos por estar en la base de datos [master]' + @stk; begin set @n = (select count(*) from @tSQL); if (@n > 0) print @stk + 'Comandos a ejecutar' + @stk; set @i = 1; while (@i <= @n) begin set @XSQL = (select XSQL from @tSQL where ROWID = @i); print @XSQL; if ((not db_name() = 'master')) exec (@XSQL); set @i += 1; end; end; if ((not db_name() = 'master')) print @stk + '¡¡¡Comandos ejecutados!!!' + @stk; -- Se muestra cantidad de objetos por tipo que han quedado select type, type_desc, COUNT(*) as CANTIDAD_DESPUES from sys.objects group by type, type_desc order by 1, 2; set nocount off; go