Copy a Database in SQL Server
SQL Server 2000 is a pesky animal when it comes to making a copy of a database. Here’s the code I use. Use the name of your database files of course. You shouldn’t need to change any code at all after the 17th line or so. Cheers!
USE master
GO
– the original database (use ‘SET @DB = NULL’ to disable backup)
DECLARE @DB varchar(200)
SET @DB = ‘COIL’
– the backup filename
DECLARE @BackupFile varchar(2000)
SET @BackupFile = ‘d:\db_backups\coil_db_200709070200.bak’
– the new database name
DECLARE @TestDB varchar(200)
SET @TestDB = ‘COILDEV’
– the new database files without .mdf/.ldf
DECLARE @RestoreFile varchar(2000)
SET @RestoreFile = ‘d:\db_backups\coil_db_200709070200′
– ****************************************************************
– no change below this line
– ****************************************************************
DECLARE @query varchar(2000)
DECLARE @DataFile varchar(2000)
SET @DataFile = @RestoreFile + ‘.mdf’
DECLARE @LogFile varchar(2000)
SET @LogFile = @RestoreFile + ‘.ldf’
IF @DB IS NOT NULL
BEGIN
SET @query = ‘BACKUP DATABASE ‘ + @DB + ‘ TO DISK = ‘ + QUOTENAME(@BackupFile, ””)
EXEC (@query)
END
– RESTORE FILELISTONLY FROM DISK = ‘C:\temp\backup.dat’
– RESTORE HEADERONLY FROM DISK = ‘C:\temp\backup.dat’
– RESTORE LABELONLY FROM DISK = ‘C:\temp\backup.dat’
– RESTORE VERIFYONLY FROM DISK = ‘C:\temp\backup.dat’
IF EXISTS(SELECT * FROM sysdatabases WHERE name = @TestDB)
BEGIN
SET @query = ‘DROP DATABASE ‘ + @TestDB
EXEC (@query)
END
RESTORE HEADERONLY FROM DISK = @BackupFile
DECLARE @File int
SET @File = @@ROWCOUNT
DECLARE @Data varchar(500)
DECLARE @Log varchar(500)
SET @query = ‘RESTORE FILELISTONLY FROM DISK = ‘ + QUOTENAME(@BackupFile , ””)
CREATE TABLE #restoretemp
(
LogicalName varchar(500),
PhysicalName varchar(500),
type varchar(10),
FilegroupName varchar(200),
size int,
maxsize bigint
)
INSERT #restoretemp EXEC (@query)
SELECT @Data = LogicalName FROM #restoretemp WHERE type = ‘D’
SELECT @Log = LogicalName FROM #restoretemp WHERE type = ‘L’
PRINT @Data
PRINT @Log
TRUNCATE TABLE #restoretemp
DROP TABLE #restoretemp
IF @File > 0
BEGIN
SET @query = ‘RESTORE DATABASE ‘ + @TestDB + ‘ FROM DISK = ‘ + QUOTENAME(@BackupFile, ””) +
‘ WITH MOVE ‘ + QUOTENAME(@Data, ””) + ‘ TO ‘ + QUOTENAME(@DataFile, ””) + ‘, MOVE ‘ +
QUOTENAME(@Log, ””) + ‘ TO ‘ + QUOTENAME(@LogFile, ””) + ‘, FILE = ‘ + CONVERT(varchar, @File)
EXEC (@query)
END