Database Copy Paste
This T-SQL script is like copy A database paste to another database B in SQL Server .
My SQL Server version is 2014, haven’t run another version.
/*declare*/ DECLARE @path varchar(100)='E:\SQL_DATA\BACKUP\'; DECLARE @backfile varchar(100)=@path+'SourceDB.baktmp'; /*backup*/ BACKUP DATABASE [SourceDB] TO DISK = @backfile WITH NOFORMAT , NOINIT , NAME = N'SourceDB-Full Database Backup' , SKIP, NOREWIND, NOUNLOAD, STATS = 10 ; /*import*/ ALTER DATABASE [TargetDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE RESTORE DATABASE [TargetDB] FROM DISK = @backfile WITH FILE = 1 , MOVE N'TargetDB' TO N'E:\SQL_DATA\TargetDB.mdf' , MOVE N'TargetDB_log' TO N'E:\SQL_DATA\TargetDB_log.ldf' , NOUNLOAD, REPLACE, STATS = 5 ALTER DATABASE [TargetDB] SET MULTI_USER ; /*delete backup file*/ DECLARE @deldate varchar(10)= CONVERT(char, DATEADD(day, +1, GETDATE()), 111); EXECUTE master.dbo.xp_delete_file 0,@path,N'baktmp',@deldate;
You need modify these :
- Modify @path
- Replace “SourceDB” to your source database name
- Replace “TargetDB” to your target database name
Maybe change to a stored procedure will be easier.
Create following script in master db.
USE [master] GO /*-------------------------------------------------- description: Copy database A to database B author: Robin date: 2016/02/20 testing Code: -------------------------------------------------- EXEC Database_Copy_Paste 'DATABASE_A','DATABASE_B' --------------------------------------------------*/ ALTER Procedure [dbo].[Database_Copy_Paste] @SourceDB nvarchar(32) , @TargetDB nvarchar(32) AS BEGIN /*set login files name*/ DECLARE @DBRowsFile varchar(32), @DBLogFile varchar(32); SET @DBRowsFile='DefaultDBRows'; SET @DBLogFile='DefaultDBLog'; /*check logic file are the same*/ DECLARE @SQLString nvarchar(1024), @ParmDefinition nvarchar(512); SET @SQLString= 'IF exists( select top 1 name from ( select ''[@SourceDB]'' as db, name from [@SourceDB].sys.database_files union all select ''[@TargetDB]'', name from [@TargetDB].sys.database_files ) t where t.name not in ( select @DBRowsFile as name union select @DBLogFile )) BEGIN select ''ALTER DATABASE ''+t.db+'' MODIFY FILE (NAME=''+t.name+'', NEWNAME=''+s.name+'');'' as [Have to excute] from ( select ''[@SourceDB]'' as db, name, type_desc from [@SourceDB].sys.database_files union select ''[@TargetDB]'', name, type_desc from [@TargetDB].sys.database_files )t left outer join ( select @DBRowsFile as name, ''ROWS'' as type_desc union select @DBLogFile, ''LOG'' ) s on t.type_desc=s.type_desc where t.name<>s.name END'; SET @SQLString = REPLACE(@SQLString, '[@SourceDB]', @SourceDB); SET @SQLString = REPLACE(@SQLString, '[@TargetDB]', @TargetDB); SET @ParmDefinition='@DBRowsFile varchar(32), @DBLogFile varchar(32)'; EXECUTE sp_executesql @SQLString, @ParmDefinition, @DBRowsFile=@DBRowsFile, @DBLogFile=@DBLogFile; IF @@ROWCOUNT>0 BEGIN PRINT 'Have to change logic file name first...'; RETURN; END; /*declare database parms */ DECLARE @BackupPath nvarchar(128), @BackupFile nvarchar(128); SET @BackupPath = 'E:\SQL_DATA\BACKUP\'; SET @BackupFile = @BackupPath+@SourceDB+'.baktmp'; SET @SQLString= '/*backup*/ BACKUP DATABASE [@SourceDB] TO DISK = @BackupFile WITH NOFORMAT , NOINIT , NAME = N''[@SourceDB]-Full Database Backup'' , SKIP, NOREWIND, NOUNLOAD, STATS = 10 ; /*import*/ DECLARE @TargetDBFile nvarchar(128), @TargetDBLogFile nvarchar(128); select @TargetDBFile = physical_name from [@TargetDB].sys.database_files where type_desc=''ROWS''; select @TargetDBLogFile = physical_name from [@TargetDB].sys.database_files where type_desc=''LOG''; ALTER DATABASE [@TargetDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE RESTORE DATABASE [@TargetDB] FROM DISK = @BackupFile WITH FILE = 1 , MOVE @DBRowsFile TO @TargetDBFile , MOVE @DBLogFile TO @TargetDBLogFile , NOUNLOAD, REPLACE, STATS = 5 ALTER DATABASE [@TargetDB] SET MULTI_USER ; /*delete backup file*/ DECLARE @deldate varchar(10)= CONVERT(char, DATEADD(day, +1, GETDATE()), 111); EXECUTE master.dbo.xp_delete_file 0,@BackupPath,N''baktmp'',@deldate ; '; SET @SQLString = REPLACE(@SQLString, '[@SourceDB]', @SourceDB); SET @SQLString = REPLACE(@SQLString, '[@TargetDB]', @TargetDB); SET @ParmDefinition= '@SourceDB nvarchar(32), @TargetDB nvarchar(32) , @BackupPath nvarchar(128), @BackupFile nvarchar(128) , @DBRowsFile varchar(32), @DBLogFile varchar(32)'; --print @ParmDefinition --print @SQLString EXECUTE sp_executesql @SQLString, @ParmDefinition , @SourceDB=@SourceDB , @TargetDB=@TargetDB , @BackupPath=@BackupPath , @BackupFile=@BackupFile , @DBRowsFile=@DBRowsFile , @DBLogFile=@DBLogFile; END GO
Then call stored procedure:
USE [master] EXEC Database_Copy_Paste 'DATABASE_A','DATABASE_B'
^_^