复制数据库的另类方法

项目要用到一个基础数据库,就是程序保存建立的工程的时候要分给每一个工程一个数据库。这样不可避免的要用到数据库复制,这是最简洁的方法。而且我们现在用的是sql2000数据库。

在网上查了很多方法,最简单的sql语句使用restore database with 。。。来做。但是我在sql2000 下使用总是报错。

不知道是sql版本的事,还是我安装的sql有问题。。。

以下是这个方法的代码,权当记录,一边后查。

-- the original database (use 'SET @DB = NULL' to disable backup) DECLARE @DB varchar(200) SET @DB = 'PcTopp' -- the backup filename DECLARE @BackupFile varchar(2000) SET @BackupFile = 'c:/pctopp/sqlserver/backup.dat' -- the new database name DECLARE @TestDB varchar(200) SET @TestDB = 'TestDB' -- the new database files without .mdf/.ldf DECLARE @RestoreFile varchar(2000) SET @RestoreFile = 'c:/pctopp/sqlserver/backup' -- **************************************************************** -- 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 GO

这是在一个外文网站上看到的代码,

msdn网站上也有:

USE master GO -- First determine the number and names of the files in the backup. -- AdventureWorks_Backup is the name of the backup device. RESTORE FILELISTONLY FROM AdventureWorks_Backup -- Restore the files for MyAdvWorks. RESTORE DATABASE MyAdvWorks FROM AdventureWorks_Backup WITH RECOVERY, MOVE 'AdventureWorks_Data' TO 'D:/MyData/MyAdvWorks_Data.mdf', MOVE 'AdventureWorks_Log' TO 'F:/MyLog/MyAdvWorks_Log.ldf' GO

这就比较简单了。

//
但是都不行,后来我就想到了一个另类的方法,就是你新建一个基础库,把该建的表都建了,该填的数据都填了。

然后备份这个数据库backup database *** to disk='';然后就把这个数据库删除掉。

这样我们使用简单的语句就能恢复它,restore databse *newdatabase name * from disk ='' ;就可以了,这就是我说的另类的方法。当然不适合所有的问题。

 

哎,发现个问题。这个方法只能复制一次。因为恢复数据库要对应文件。这个文件只能对应一个数据库。所以还是不行啊。

你可能感兴趣的:(复制数据库的另类方法)