In the previous article I wrote about how to identify and remove unwanted tables. Link
In that tutorial I suggested prefixing the tables you want to remove with _DELETE_.
I also suggested you may want to archive the tables in some manner before you delete them. This could be because there is a chance someone might come looking for the data that was in a deleted table or something might break by removing the table and you might want to put it back asap.
If you have only a few tables you could script the tables out but if you have a lot of tables that becomes a little unmanageable. Also if the tables total in size to 10 Gb the script to recreate the tables will be a lot lot larger.
An alternative method is to create an Archive database, copy the tables across to this target database and then delete the tables in the source database. You can then backup and drop the Archive database saving the .bak file somewhere cheaper.
The script below will allow you to do just that. It prints the T-Sql to do the job, it doesn’t carry out the job, so it’s completely safe to execute and review.
To use the script below create a target database.
Use the target database name for the variable value @TargetDb
Use the source database name for the variable value @SourceDb
The @KeyWord variable is used to gather all the tables that contain the string of choice, in the example below _DELETE_.
The @RemoveKeyWord variable is a flag that will remove the keyword string from the target database table name, e.g. _DELETE_Sales will become Sales.
IF OBJECT_ID('tempdb..#Table') IS NOT NULL DROP TABLE #Table GO DECLARE @RemoveKeyWord BIT DECLARE @Id AS INT DECLARE @KeyWord AS VARCHAR(256) DECLARE @SourceDb AS SYSNAME DECLARE @TargetDb AS SYSNAME DECLARE @TableName AS SYSNAME DECLARE @SchemaName AS SYSNAME DECLARE @Sql AS VARCHAR(MAX) SET @RemoveKeyWord = 1 SET @KeyWord = '_DELETE_' SET @TargetDb = 'Archive' SET @SourceDb = 'Source' SET NOCOUNT ON CREATE TABLE #Table ( Id_Table INT IDENTITY(1, 1) ,SchemaName SYSNAME ,TableName SYSNAME ); SET @Sql = ' INSERT INTO #Table ( SchemaName ,TableName ) SELECT s.NAME ,so.NAME FROM ' + QUOTENAME(@SourceDb) + '.sys.tables AS so LEFT JOIN ' + QUOTENAME(@SourceDb) + '.sys.schemas AS s ON so.schema_id = s.schema_id WHERE so.NAME LIKE ' + '''' + '%' + @KeyWord + '%' + '''' + ' ORDER BY s.NAME ASC' EXEC (@Sql) SET @SchemaName = '' WHILE @SchemaName IS NOT NULL BEGIN SET @SchemaName = ( SELECT MIN(SchemaName) FROM #Table WHERE SchemaName > @SchemaName AND SchemaName <> 'dbo' ) PRINT 'USE ' + QUOTENAME(@TargetDb) + '; GO IF NOT EXISTS (SELECT * FROM ' + QUOTENAME(@TargetDb) + '.sys.schemas WHERE name = ' + '''' + @SchemaName + '''' + ') BEGIN EXEC (' + '''' + 'CREATE SCHEMA ' + QUOTENAME(@SchemaName) + ';' + '''' + '); END; ' END SET @Id = 1 WHILE @Id IS NOT NULL BEGIN SELECT @TableName = TableName ,@SchemaName = SchemaName FROM #Table WHERE Id_Table = @Id IF @RemoveKeyWord = 1 BEGIN PRINT ' SELECT * INTO ' + QUOTENAME(@TargetDb) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(REPLACE(@TableName, @KeyWord, '')) + ' FROM ' + QUOTENAME(@SourceDb) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) END ELSE BEGIN PRINT ' SELECT * INTO ' + QUOTENAME(@TargetDb) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + ' FROM ' + QUOTENAME(@SourceDb) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) END SET @Id = ( SELECT MIN(Id_Table) FROM #Table WHERE Id_Table > @Id ) END