如何还原某一个目录下的所有数据库备份文件

引述

在工作中,经常为测试或开发部门搭建数据库环境,每一次搭建环境,需要还原某一个目录下的所有数据库备份文件,也就是,一次需要还原一百多个数据库。

每碰到类似的情况,需要编写一个SQL脚本来实现还原数据库的功能。这里就简单介绍如何编写存储过程来实现,还原某一个目录下的所有数据库备份文件。

要实现还原某一个目录下的所有数据库备份文件,首先要实现还原某一个目录下的某一个备份文件。真实世界中,只提供数据库备份路径,和备份数据库文件名,及还原到的本地路径。接下来,将讲述以下内容:

  • 根据备份文件找出数据库名
  • 根据备份文件找出数据、日志目录列表
  • 构造还原数据库SQL语句
  • 还原单个数据库的存储过程代码
  • 还原多个数据库的存储过程代码(一个目录下)

●根据备份文件找出数据库名

在还原数据库的开始,我们先要知道把备份数据库文件还原到哪一个数据库上。在真实世界中,我们无法保证备份数据库文件都为”数据库名+.bak”格式 (如:myDB.bak,其中myDB就是数据库名)。通常情况,只知道备份文件,需要知道数据库名,我们可以通过SQL Server提供的T-SQL语句“Restore HeaderOnly”来找出原来的数据库名,简单语法这样:Restore HeaderOnly From

返回的结果集中,有一列”DatabaseName”描述备份的数据名。通过”DatabaseName”列,就可以找出我们需要的原来数据库名了。

e.g.

  1. Restore HeaderOnly From Disk = 'E:\DBBackup\dbA2011-09-05.bak' 

【注:】在结果集中, SQL Server 2008/R2 比 SQL Server 2005 多一个列”CompressedBackupSize”。

●根据备份文件找出数据、日志列表

接下来,我们需要知道备份文件中包含哪些数据、日志文件,及要知道原来的文件路径是什么。要是原来的数据库文件存储路径与新路径不一致,我们需要在”Restore Database …” 里面使用” Move”选项。这里我们可以通过使用SQL Server 提供的T-SQL语句”Restore FileListOnly”,返回数据库和日志文件列表组成的结果集,简单语法这样:Restore FileListOnly From <backup_device>

e.g.

  1. Restore FileListOnly From Disk = 'E:\DBBackup\dbA2011-09-05.bak'

【注:】在结果集中, SQL Server 2008/R2 比 SQL Server 2005 多一个列”TDEThumbprint”,应用于显示数据库加密密钥的指纹。

●构造还原数据库SQL语句

上面两点内容,我们根据备份文件,知道了要还原的数据库名和数据库文件列表,那么,我们基本可以构造出还原数据库的SQL语句了。

e.g.

  1. Restore DataBase dbA  
  2.     From Disk='E:\DBBackup\dbA2011-09-05.bak'  
  3.     With File=1, 
  4.         Move 'dbA' To 'E:\DATA\SQL2008DE01\dbA.mdf'
  5.         Move 'dbA_log' To 'E:\DATA\SQL2008DE01\dbA_Log.LDF',Replace,Recovery 

#p#

●还原单个数据库的存储过程代码

根据上面分析的方法,这里演示我写的一个还原单个数据库的存储过程代码,因为代码是之前写的,中间因真实世界的特殊情况,修改成几个版本的存储过程。当然,如有可能,你可以根据自己所在的真实环境,修改对应部分的代码,以便满足自己的需要。

存储过程sp_RestoreDataBase代码:

  1. Use master 
  2. Go 
  3. if object_ID('[sp_restoredatabase]'is not null 
  4.     Drop Procedure [sp_restoredatabase] 
  5. Go 
  6. /* 
  7.     --还原数据库(v3.2) Andy 2011-2-22 
  8.     @DatabBaseBakPath nvarchar(260), --数据库备份路径(包含备份文件名) 
  9.     @DatabBaseNewPath nvarchar(260)  --新数据库路径 
  10.     @NewDataBaseName nvarchar(128)   --新数据库名 
  11.     e.g: 
  12.     --Exec sp_RestoreDataBase 'E:\DatabaseBackup\DE\Support_2008722_14_33_39.bak','D:\SQL2005\DE' 
  13.     V3.0版本修改说明: 
  14.         1.修正了之前版本在还原包含全文索引文件的时候发生的错误。 
  15.         2.修正了之前版本在还原包含多个数据库文件和日志文件时发生的错误。 
  16.     V3.1版本说明,增加了参数@Keep_Replication,表示是否保存复制设定 
  17.     V3.2版本说明,增加了FILE ={ file_number | @file_number } 逻辑判断,在包含多个备份组,还原最后一个备份组 
  18.     V3.3 版本说明 ,还原发生错误时返回 1 
  19. */ 
  20. CREATE Proc sp_RestoreDataBase 
  21.     @DatabBaseBakPath nvarchar(260), 
  22.     @DatabBaseNewPath nvarchar(260), 
  23.     @NewDataBaseName nvarchar(128)=null
  24.     @Keep_Replication bit=0 
  25. As 
  26.  
  27. Set Nocount On 
  28. Begin Try 
  29.     Declare 
  30.         @DataBaseName nvarchar(128), 
  31.         @Sql nvarchar(max), 
  32.         @SqlDatabaseRename nvarchar(max), 
  33.         @Enter nvarchar(10) 
  34.     --检查文件路径是否正确 
  35.     Declare 
  36.         @Dir nvarchar(4000), 
  37.         @i int 
  38. --    Set @Dir='Dir '+@DatabBaseBakPath 
  39. --    Exec @i=xp_cmdshell  @Dir,no_output 
  40. --    If @i<>0     
  41.     Exec master.dbo.xp_fileexist @DatabBaseBakPath,@i Output 
  42.     If @i=0 
  43.     Begin 
  44.         Raiserror 50001 N'无效的备份数据库路径/文件名!' 
  45.         Return 1 
  46.     End 
  47.      
  48.     If Charindex('\\',@DatabBaseNewPath)>0 
  49.     Begin 
  50.         Raiserror 50001 N'数据库还原路径中不能含有''\\''!' 
  51.         Return 1 
  52.     End   
  53.     If Right(Rtrim(@DatabBaseNewPath),1)='\' 
  54.     Begin 
  55.         Raiserror 50001 N'数据库还原路径的最后一位能含有''\''!' 
  56.         Return 1 
  57.     End 
  58.     Set @Dir='Dir '+@DatabBaseNewPath 
  59.     Exec @i=xp_cmdshell  @Dir,no_output 
  60.     If @i<>0 
  61.     Begin 
  62.         Raiserror 50001 N'无效的数据库还原路径!' 
  63.         Return 1 
  64.     End 
  65.     set @DatabBaseNewPath=replace(@DatabBaseNewPath,'"',''
  66.     /* 
  67.     --SQL Server 2005 
  68.     Declare @BakFileList Table(LogicalName nvarchar(128),PhysicalName nvarchar(260),Type char(1),FileGroupName nvarchar(128),Size numeric(20,0),MaxSize numeric(20,0),FileID bigint,CreateLSN numeric(25,0),DropLSN numeric(25,0) NULL,UniqueID uniqueidentifier,ReadOnlyLSN numeric(25,0) NULL,ReadWriteLSN numeric(25,0) NULL,BackupSizeInBytes bigint,SourceBlockSize int,FileGroupID int,LogGroupGUID uniqueidentifier NULL,DifferentialBaseLSN numeric(25,0) NULL,DifferentialBaseGUID uniqueidentifier,IsReadOnly bit,IsPresent bit
  69.     */ 
  70.     --SQL Server 2008 
  71.     Declare @BakFileList Table(LogicalName nvarchar(128),PhysicalName nvarchar(260),Type char(1),FileGroupName nvarchar(128),Size numeric(20,0),MaxSize numeric(20,0),FileID bigint,CreateLSN numeric(25,0),DropLSN numeric(25,0) NULL,UniqueID uniqueidentifier,ReadOnlyLSN numeric(25,0) NULL,ReadWriteLSN numeric(25,0) NULL,BackupSizeInBytes bigint,SourceBlockSize int,FileGroupID int,LogGroupGUID uniqueidentifier NULL,DifferentialBaseLSN numeric(25,0) NULL,DifferentialBaseGUID uniqueidentifier,IsReadOnly bit,IsPresent bit,TDEThumbprint varbinary(32)) 
  72.     Insert Into @BakFileList 
  73.         Exec sp_executesql N'Restore FileListOnly From Disk=@DatabBaseBakPath',N'@DatabBaseBakPath nvarchar(260)',@DatabBaseBakPath 
  74.     /* 
  75.     --SQL Server 2005 
  76.     Declare @BakHeaderInfo Table(BackupName nvarchar(128),BackupDescription nvarchar(255),BackupType smallint,ExpirationDate datetime,Compressed tinyint,Position smallint,DeviceType tinyint,UserName nvarchar(128),ServerName nvarchar(128),DatabaseName nvarchar(128),DatabaseVersion int,DatabaseCreationDate datetime,BackupSize numeric(20,0),FirstLSN numeric(25,0),LastLSN numeric(25,0),CheckpointLSN numeric(25,0),DatabaseBackupLSN numeric(25,0),BackupStartDate datetime,BackupFinishDate datetime,SortOrder smallint,CodePage smallint,UnicodeLocaleId int,UnicodeComparisonStyle int,CompatibilityLevel tinyint,SoftwareVendorId int,SoftwareVersionMajor int,SoftwareVersionMinor int,SoftwareVersionBuild int,MachineName nvarchar(128),Flags int,BindingID uniqueidentifier,RecoveryForkID uniqueidentifier,Collation nvarchar(128),FamilyGUID uniqueidentifier,HasBulkLoggedData bit,IsSnapshot bit,IsReadOnly bit,IsSingleUser bit,HasBackupChecksums bit,IsDamaged bit,BeginsLogChain bit,HasIncompleteMetaData bit,IsForceOffline bit,IsCopyOnly bit,FirstRecoveryForkID uniqueidentifier,ForkPointLSN numeric(25,0) NULL,RecoveryModel nvarchar(60),DifferentialBaseLSN numeric(25,0) NULL,DifferentialBaseGUID uniqueidentifier,BackupTypeDescription nvarchar(60),BackupSetGUID uniqueidentifier NULL
  77.     */ 
  78.     --SQL Server 2008 
  79.     Declare @BakHeaderInfo Table(BackupName nvarchar(128),BackupDescription nvarchar(255),BackupType smallint,ExpirationDate datetime,Compressed tinyint,Position smallint,DeviceType tinyint,UserName nvarchar(128),ServerName nvarchar(128),DatabaseName nvarchar(128),DatabaseVersion int,DatabaseCreationDate datetime,BackupSize numeric(20,0),FirstLSN numeric(25,0),LastLSN numeric(25,0),CheckpointLSN numeric(25,0),DatabaseBackupLSN numeric(25,0),BackupStartDate datetime,BackupFinishDate datetime,SortOrder smallint,CodePage smallint,UnicodeLocaleId int,UnicodeComparisonStyle int,CompatibilityLevel tinyint,SoftwareVendorId int,SoftwareVersionMajor int,SoftwareVersionMinor int,SoftwareVersionBuild int,MachineName nvarchar(128),Flags int,BindingID uniqueidentifier,RecoveryForkID uniqueidentifier,Collation nvarchar(128),FamilyGUID uniqueidentifier,HasBulkLoggedData bit,IsSnapshot bit,IsReadOnly bit,IsSingleUser bit,HasBackupChecksums bit,IsDamaged bit,BeginsLogChain bit,HasIncompleteMetaData bit,IsForceOffline bit,IsCopyOnly bit,FirstRecoveryForkID uniqueidentifier,ForkPointLSN numeric(25,0) NULL,RecoveryModel nvarchar(60),DifferentialBaseLSN numeric(25,0) NULL,DifferentialBaseGUID uniqueidentifier,BackupTypeDescription nvarchar(60),BackupSetGUID uniqueidentifier NULL,CompressedBackupSize numeric(20,0)) 
  80.     Insert Into @BakHeaderInfo 
  81.         Exec sp_executesql N'Restore HeaderOnly From Disk=@DatabBaseBakPath',N'@DatabBaseBakPath nvarchar(260)',@DatabBaseBakPath 
  82.   
  83.      
  84.     If Isnull(@NewDataBaseName,'')>'' --使用新的数据库名,要是沒有指定就使用原來的数据库名 
  85.         Set @DataBaseName=@NewDataBaseName 
  86.     Else 
  87.     Begin   
  88.         Select @DataBaseName=DatabaseName From @BakHeaderInfo 
  89.     End 
  90.   
  91.      
  92.     Set @Enter=char(13)+Char(10) 
  93.     Select @Sql=Isnull(@Sql+@Enter,'')+'Kill '+Rtrim(spid) From master.sys.sysprocesses Where dbid=db_id(@DataBaseName) 
  94.     Exec(@Sql) 
  95.      
  96.     Set @Sql=N'Restore DataBase @DataBaseName From Disk=@DatabBaseBakPath With File=??,' --+(Select 'File='+rtrim(max(Position))+', ' From @BakHeaderInfo) 
  97.   
  98.     Select  @Sql=@Sql+'Move '''+LogicalName+''' To '''+@DatabBaseNewPath+'\'+@DataBaseName+ 
  99.             Case 
  100.                 When [Type]='D' And Not Exists(Select 1 From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) Then '' 
  101.                 When [Type]='D' Then '_'+(Select Rtrim(Count(*)) From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) 
  102.                 When [Type]='L' And Not Exists(Select 1 From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) Then '_Log' 
  103.                 When [Type]='L' Then '_Log'+(Select Rtrim(Count(*)) From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) 
  104.                 Else '' 
  105.             End+Right(PhysicalName,Charindex('.',Reverse(PhysicalName)))+''','
  106.             @SqlDatabaseRename=Isnull(@SqlDatabaseRename+@Enter,'')+ 
  107.                 Case 
  108.                     When [Type]='D' And LogicalName=@DataBaseName Then '' 
  109.                     When [Type]='D' And LogicalName Like @DataBaseName+'[_]%' Then '' 
  110.                     When [Type]='L' And LogicalName Like @DataBaseName+'[_]Log%' Then '' 
  111.                     When [Type]='F' Then '' 
  112.                     Else 
  113.                         'Alter DataBase '+Quotename(@DataBaseName)+' Modify File(Name='''+LogicalName+''',NewName='''+@DataBaseName+ 
  114.                         Case 
  115.                             When [Type]='D' And Not Exists(Select 1 From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) Then '' 
  116.                             When [Type]='D' Then '_'+(Select Rtrim(Count(*)) From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) 
  117.                             When [Type]='L' And Not Exists(Select 1 From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) Then '_Log' 
  118.                             When [Type]='L' Then '_Log'+(Select Rtrim(Count(*)) From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) 
  119.                             Else '' 
  120.                         End+''')' 
  121.                 End 
  122.         From @BakFileList As a 
  123.      
  124.      
  125.     Set @Sql=@Sql+'Replace' 
  126.      
  127.     If @Keep_Replication=1 
  128.         Set @Sql=@Sql+'Keep_Replication' 
  129.      
  130.     Declare @sql1 nvarchar(max), 
  131.             @MaxPosition int 
  132.      
  133.     Select @MaxPosition=Position 
  134.         From @BakHeaderInfo As a 
  135.         Where a.BackupType=1 
  136.                 And Not Exists(Select 1 From @BakHeaderInfo Where BackupType=a.BackupType And Position>a.Position) 
  137.      
  138.      
  139.     Select @sql1=isnull(@sql1+char(13)+char(10),'')+replace(@sql,'??',rtrim(Position)) + 
  140.             Case When Exists(Select 1 From @BakHeaderInfo Where Position>a.Position) Then N',Norecovery' Else N',Recovery' End 
  141.         From @BakHeaderInfo As a 
  142.         Where Position>=@MaxPosition 
  143.         Order By Position 
  144.          
  145.     Print '还原数据库: '+@DataBaseName 
  146.   
  147.      
  148. --    Print @sql1 
  149.     Exec sp_executesql @sql1,N'@DataBaseName nvarchar(128),@DatabBaseBakPath nvarchar(260)',@DataBaseName,@DatabBaseBakPath 
  150.   
  151.     If @SqlDatabaseRename>'' 
  152.         Exec(@SqlDatabaseRename) 
  153.   
  154. End Try 
  155. Begin Catch 
  156.     Declare @Error nvarchar(1024) 
  157.     Set @Error=ERROR_MESSAGE() 
  158.     Raiserror 50001 @Error 
  159.     Return 1 
  160. End Catch 
  161.     Set Nocount Off 
  162.   
  163.   
  164. Go 

存储过程测试:

  1. use master 
  2. Go 
  3. Exec dbo.sp_RestoreDataBase 'E:\DBBackup\dbA2011-09-05.bak','E:\DATA\SQL2008DE01' 
  4. go 

#p#

●还原多个数据库的存储过程代码(一个目录下)

当一个目录下,存放这很多个备份文件的时候,我们需要还原整个目录,或者部分数据库备份文件,这时我们另外一个存储过程能实现这样的操作。这里我写一个存储过程sp_RestoreDataBase2:

  1. if object_id('sp_restoredatabase2'Is Not Null 
  2.     Drop proc sp_restoredatabase2 
  3. Go 
  4. create proc sp_restoredatabase2 
  5.     @Path_bak nvarchar(1024), 
  6.     @Path_new nvarchar(1024)=null
  7.     @DataBaseList nvarchar(max)=null 
  8. As 
  9. /* 
  10.  
  11. @DataBaseList 数据库列表,可留空,或数据库之间使用回车、空格、逗号分隔都ok 
  12.  
  13. */ 
  14.  
  15.  
  16. Set Nocount On 
  17. Declare @subdirectory nvarchar(1024),@ErrorMsg nvarchar(1024),@flag smallint 
  18.  
  19. if isnull(@Path_new,'')=''         
  20.     exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', @Path_new Output     
  21.  
  22.  
  23. If Not Exists(Select 1 From master.sys.procedures Where name='sp_RestoreDataBase'
  24. Begin 
  25.     Raiserror 50001 N'找不到存储过程 sp_RestoreDataBase ' 
  26.     Goto ExitFLag 
  27. End 
  28.  
  29.  
  30. Declare @Dir Table(subdirectory nvarchar(1024),depth int,[file] int
  31. Declare @DBList table (DatabaseName nvarchar(128)) 
  32. Declare @DBListNull table (DatabaseName nvarchar(128)) 
  33.  
  34. /* 
  35. --SQL Server 2005 
  36. Declare @BakHeaderTMP Table(BackupName nvarchar(128),BackupDescription nvarchar(255),BackupType smallint,ExpirationDate datetime,Compressed tinyint,Position smallint,DeviceType tinyint,UserName nvarchar(128),ServerName nvarchar(128),DatabaseName nvarchar(128),DatabaseVersion int,DatabaseCreationDate datetime,BackupSize numeric(20,0),FirstLSN numeric(25,0),LastLSN numeric(25,0),CheckpointLSN numeric(25,0),DatabaseBackupLSN numeric(25,0),BackupStartDate datetime,BackupFinishDate datetime,SortOrder smallint,CodePage smallint,UnicodeLocaleId int,UnicodeComparisonStyle int,CompatibilityLevel tinyint,SoftwareVendorId int,SoftwareVersionMajor int,SoftwareVersionMinor int,SoftwareVersionBuild int,MachineName nvarchar(128),Flags int,BindingID uniqueidentifier,RecoveryForkID uniqueidentifier,Collation nvarchar(128),FamilyGUID uniqueidentifier,HasBulkLoggedData bit,IsSnapshot bit,IsReadOnly bit,IsSingleUser bit,HasBackupChecksums bit,IsDamaged bit,BeginsLogChain bit,HasIncompleteMetaData bit,IsForceOffline bit,IsCopyOnly bit,FirstRecoveryForkID uniqueidentifier,ForkPointLSN numeric(25,0) NULL,RecoveryModel nvarchar(60),DifferentialBaseLSN numeric(25,0) NULL,DifferentialBaseGUID uniqueidentifier,BackupTypeDescription nvarchar(60),BackupSetGUID uniqueidentifier NULL
  37. */ 
  38. --SQL Server 2008 
  39. Declare @BakHeaderTMP Table(BackupName nvarchar(128),BackupDescription nvarchar(255),BackupType smallint,ExpirationDate datetime,Compressed tinyint,Position smallint,DeviceType tinyint,UserName nvarchar(128),ServerName nvarchar(128),DatabaseName nvarchar(128),DatabaseVersion int,DatabaseCreationDate datetime,BackupSize numeric(20,0),FirstLSN numeric(25,0),LastLSN numeric(25,0),CheckpointLSN numeric(25,0),DatabaseBackupLSN numeric(25,0),BackupStartDate datetime,BackupFinishDate datetime,SortOrder smallint,CodePage smallint,UnicodeLocaleId int,UnicodeComparisonStyle int,CompatibilityLevel tinyint,SoftwareVendorId int,SoftwareVersionMajor int,SoftwareVersionMinor int,SoftwareVersionBuild int,MachineName nvarchar(128),Flags int,BindingID uniqueidentifier,RecoveryForkID uniqueidentifier,Collation nvarchar(128),FamilyGUID uniqueidentifier,HasBulkLoggedData bit,IsSnapshot bit,IsReadOnly bit,IsSingleUser bit,HasBackupChecksums bit,IsDamaged bit,BeginsLogChain bit,HasIncompleteMetaData bit,IsForceOffline bit,IsCopyOnly bit,FirstRecoveryForkID uniqueidentifier,ForkPointLSN numeric(25,0) NULL,RecoveryModel nvarchar(60),DifferentialBaseLSN numeric(25,0) NULL,DifferentialBaseGUID uniqueidentifier,BackupTypeDescription nvarchar(60),BackupSetGUID uniqueidentifier NULL,CompressedBackupSize numeric(20,0)) 
  40.  
  41.      
  42.  
  43.  
  44. While charindex(char(13)+Char(10),@DataBaseList)>0 
  45.     Set @DataBaseList=Replace(@DataBaseList,char(13)+Char(10),','
  46. While charindex(char(13),@DataBaseList)>0 
  47.     Set @DataBaseList=Replace(@DataBaseList,char(13),','
  48. While charindex(char(9),@DataBaseList)>0 
  49.     Set @DataBaseList=Replace(@DataBaseList,char(9),','
  50. While charindex(char(32),@DataBaseList)>0 
  51.     Set @DataBaseList=Replace(@DataBaseList,Char(32),','
  52.  
  53.          
  54. Set @DataBaseList='Select '''+Replace(@DataBaseList,',',''' Union All Select ''')+'''' 
  55. Insert Into @DBList  Exec(@DataBaseList) 
  56.  
  57. Delete @DBList Where DatabaseName ='' 
  58.  
  59. Insert Into @Dir Exec xp_dirtree @Path_bak,1,1 
  60.  
  61. If Not Exists(Select subdirectory From @Dir Where Charindex('.bak',subdirectory)>0) 
  62. Begin 
  63.     Set @ErrorMsg= N'无效的数据库路径: '+ rtrim(@Path_bak) 
  64.     Raiserror 50001 @ErrorMsg 
  65.     Goto ExitFlag 
  66. End 
  67.  
  68.  
  69.  
  70. Declare cur_x cursor For Select subdirectory From @Dir Where Charindex('.bak',subdirectory)>0 
  71. Open cur_x 
  72. Fetch Next From cur_x Into @subdirectory 
  73. While @@Fetch_status=0 
  74. Begin 
  75.      
  76.     Set @subdirectory=Case When Right(@Path_bak,1)='\' Then @Path_bak Else   @Path_bak+'\' End+@subdirectory 
  77.      
  78.     Delete From @BakHeaderTMP 
  79.  
  80.     Insert Into @BakHeaderTMP 
  81.         Exec sp_executesql N'Restore HeaderOnly From Disk=@DatabBaseBakPath',N'@DatabBaseBakPath nvarchar(260)',@subdirectory 
  82.          
  83.     IF @@ERROR <> 0             
  84.         Break 
  85.     Else if Exists(Select 1 From @BakHeaderTMP As a Where Exists(Select 1 From @DBList Where DatabaseName=a.DatabaseName) Or Not Exists(Select 1 From @DBList))         
  86.         Begin 
  87.             Exec @flag=sp_RestoreDataBase @subdirectory,@Path_new             
  88.             If @flag <>0 Break 
  89.         End 
  90.  
  91.     Insert Into @DBListNull(DatabaseName) 
  92.         Select DatabaseName From @BakHeaderTMP     
  93.                          
  94.     Fetch Next From cur_x Into @subdirectory 
  95. End 
  96. CLose cur_x 
  97. Deallocate cur_x 
  98.  
  99.  
  100.  
  101. If Exists(Select 1 From @DBList a Where Not Exists(Select 1 From @DBListNull Where DatabaseName=a.DatabaseName)) 
  102.     Select DatabaseName As [无效的数据库] From @DBList a Where Not Exists(Select 1 From @DBListNull Where DatabaseName=a.DatabaseName) 
  103.  
  104. print replicate('=',60) 
  105. Print N'@Path_new :  '+@Path_new 
  106.  
  107. ExitFLag: 
  108.  
  109. Go 

存储过程测试:

  1. use master 
  2. Go 
  3. Exec dbo.sp_RestoreDataBase2 'E:\DBBackup' 
  4. go 

小结

上面还原数据库的存储过程,它们给我们在工作中还原数据库的时候,带来许多便捷,如,不用我们一个个通过Microsoft SQL Server Management Studio(MSSMS)中的还原数据库向导去还原数据库,或也不用我们一个个执行”Restore Database”SQL语句去还原数据库。当然,在上面的代码中,我没有对每一个存储过程的每一个具体位置,进行解释。没有全部应用到”Restore Database”中”WITH”选项,我编写的主要目的是,存储过程参数尽可能的少,操作起来更方便,尽可能满足真实环境中的需要。如果你应用到以上的代码,可以根据自己所在的真实环境,进行修改补充。

原文链接:http://www.cnblogs.com/wghao/archive/2011/09/07/2169409.html

【编辑推荐】

  1. 数据挖掘中易犯的几大错误
  2. 整理索引碎片,提升SQL Server速度
  3. 大数据平台:探索数据价值
  4. Big Data技术综述
  5. SQL Server引入Hadoop大数据处理能力

 

 

 

 

 

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/285133.html<

(0)
管理的头像管理
上一篇2025-05-14 18:06
下一篇 2025-05-14 18:08

相关推荐

  • 云服务器和云虚拟主机怎么选?云服务器和虚拟主机区别

    云服务器适合业务增长快、需弹性扩展的场景,而云虚拟主机适合预算有限、技术门槛低的小型静态网站或测试环境,二者核心区别在于资源独享性与运维复杂度,核心差异解析:从底层架构到使用体验很多人容易混淆这两者,觉得它们都是“买空间建站”,它们的底层逻辑完全不同,云服务器(ECS)就像是你租了一整栋别墅,水电网络独立,你想……

    2026-06-29
    0
  • 赣州智慧旅游招聘是真的吗?赣州旅游人才招聘信息

    中级岗位(3-5年经验)月薪范围通常在6000-10000元,这类岗位需要独立负责项目模块,如独立运营一个抖音账号,或维护一个景区小程序的功能迭代,具备成功案例的候选人议价能力较强,高级岗位(5年以上经验)月薪范围通常在10000-20000元,部分核心管理岗可达更高,这类人才需要具备战略规划能力,如制定整个景……

    2026-06-29
    0
  • 赣州智能物联网车位锁如何管理?智能车位锁管理系统多少钱

    赣州智能物联网车位锁管理的核心在于通过云端平台实现远程控锁、状态实时监控及自动计费,彻底解决传统车位“被占难管”与“找位难”的痛点,在赣州这样的城市,随着机动车保有量的持续增长,老旧小区、商业综合体以及私人固定车位的资源矛盾日益凸显,传统的机械地锁或简易遥控锁,不仅操作繁琐,更无法实现数据化管理,引入智能物联网……

    2026-06-29
    0
  • 赣州智能消防栓好用吗,智能消防栓多少钱一个

    赣州智能消防栓通过物联网技术实现实时监测与远程报警,能显著降低火灾响应时间并提升城市消防安全管理水平,是目前智慧城市建设中不可或缺的基础设施,赣州智能消防栓的核心价值与应用场景传统消防栓往往存在“看不见、摸不着、用不了”的痛点,在赣州这样地形复杂、老城区与新城区并存的区域,传统设施的管理难度极大,智能消防栓的出……

    2026-06-29
    0
  • 云服务器和物理机到底有啥区别?

    云服务器本质上是虚拟化资源池中的弹性实例,而传统物理服务器是独占的硬件实体,前者胜在弹性与运维便捷,后者强在物理隔离与性能稳定,具体选择取决于业务对成本、扩展性及安全合规的权衡,很多人初次接触服务器时,容易把“云服务器”和“传统物理服务器”混为一谈,觉得它们都是用来跑网站或存数据的盒子,这两者的底层逻辑完全不同……

    2026-06-29
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注