您所在的位置:首页 > 资讯教程 > 软件教程 > 系统工具 > 2017注册娱乐送白菜2017注册娱乐送白菜

2017注册娱乐送白菜2017注册娱乐送白菜

2017-07-12 22:06:39  来源:互联网  次阅读

 引述


在工作中,经常为测试或开发部门搭建数据库环境,每一次搭建环境,需要2017注册娱乐送白菜2017注册娱乐送白菜,也就是,一次需要还原一百多个数据库。

每碰到类似的情况,需要编写一个SQL脚本来实现还原数据库的功能。这里就简单介绍如何编写存储过程来实现,2017注册娱乐送白菜2017注册娱乐送白菜。

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

●根据备2017注册娱乐送白菜找出数据库名

●根据备2017注册娱乐送白菜找出数据、日志目录列表

●构造还原数据库SQL语句

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

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

 

●根据备2017注册娱乐送白菜找出数据库名


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

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

e.g.

Restore HeaderOnly From Disk = 'E:\DBBackup\dbA2011-09-05.bak'
image
 
【注:】在结果集中,  SQL Server 2008/R2 比 SQL Server 2005 多一个列”CompressedBackupSize”。

●根据备2017注册娱乐送白菜找出数据、日志列表


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

e.g.

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

image

 

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

 

●构造还原数据库SQL语句


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

e.g.

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

 

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


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

存储过程sp_RestoreDataBase代码:

 

[sql] view plain copy
 
 print?
  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.    
  9.     @DatabBaseBakPath nvarchar(260), --数据库备份路径(包含备2017注册娱乐送白菜名)  
  10.     @DatabBaseNewPath nvarchar(260)  --新数据库路径  
  11.      @NewDataBaseName nvarchar(128)   --新数据库名  
  12.    
  13.     e.g:  
  14.     --Exec sp_RestoreDataBase 'E:\DatabaseBackup\DE\Support_2008722_14_33_39.bak','D:\SQL2005\DE'  
  15.       
  16.       
  17.     V3.0版本修改说明:  
  18.         1.修正了之前版本在还原包含全文索引文件的时候发生的错误。  
  19.         2.修正了之前版本在还原包含多个数据库文件和日志文件时发生的错误。  
  20.       
  21.     V3.1版本说明,增加了参数@Keep_Replication,表示是否保存复制设定  
  22.       
  23.     V3.2版本说明,增加了FILE ={ file_number | @file_number } 逻辑判断,在包含多个备份组,还原最后一个备份组  
  24.       
  25.     V3.3 版本说明 ,还原发生错误时返回 1  
  26. */  
  27. CREATE Proc sp_RestoreDataBase  
  28. (  
  29.     @DatabBaseBakPath nvarchar(260),  
  30.     @DatabBaseNewPath nvarchar(260),  
  31.     @NewDataBaseName nvarchar(128)=null,  
  32.     @Keep_Replication bit=0  
  33. )  
  34. As  
  35.    
  36. Set Nocount On  
  37. Begin Try  
  38.     Declare  
  39.         @DataBaseName nvarchar(128),  
  40.         @Sql nvarchar(max),  
  41.         @SqlDatabaseRename nvarchar(max),  
  42.         @Enter nvarchar(10)  
  43.    
  44.    
  45.     --检查文件路径是否正确  
  46.     Declare  
  47.         @Dir nvarchar(4000),  
  48.         @i int  
  49.       
  50.       
  51. --    Set @Dir='Dir '[email protected]  
  52.       
  53. --    Exec @i=xp_cmdshell  @Dir,no_output  
  54. --    If @i<>0  
  55.       
  56.     Exec master.dbo.xp_fileexist @DatabBaseBakPath,@i Output  
  57.     If @i=0  
  58.     Begin  
  59.         Raiserror 50001 N'无效的备份数据库路径/文件名!'  
  60.         Return 1  
  61.     End  
  62.       
  63.     If Charindex('\\',@DatabBaseNewPath)>0  
  64.     Begin  
  65.         Raiserror 50001 N'数据库还原路径中不能含有''\\''!'  
  66.         Return 1  
  67.     End  
  68.    
  69.     If Right(Rtrim(@DatabBaseNewPath),1)='\'  
  70.     Begin  
  71.         Raiserror 50001 N'数据库还原路径的最后一位能含有''\''!'  
  72.         Return 1  
  73.     End  
  74.       
  75.       
  76.     Set @Dir='Dir '[email protected]  
  77.     Exec @i=xp_cmdshell  @Dir,no_output  
  78.     If @i<>0  
  79.     Begin  
  80.         Raiserror 50001 N'无效的数据库还原路径!'  
  81.         Return 1  
  82.     End  
  83.    
  84.     set @DatabBaseNewPath=replace(@DatabBaseNewPath,'"','')  
  85.       
  86.       
  87.     /*  
  88.     --SQL Server 2005  
  89. 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)  
  90.     */  
  91.     --SQL Server 2008  
  92. 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))  
  93.       
  94.   
  95.     Insert Into @BakFileList  
  96.         Exec sp_executesql N'Restore FileListOnly From [email protected]',N'@DatabBaseBakPath nvarchar(260)',@DatabBaseBakPath  
  97.    
  98.     /*  
  99.     --SQL Server 2005  
  100.     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)  
  101.     */  
  102.     --SQL Server 2008  
  103. Declare @BakHeaderInfo Table(BackupName nvarchar(128),  
  104. BackupDescription nvarchar(255),  
  105. BackupType smallint,ExpirationDate datetime,  
  106. Compressed tinyint,Position smallint,DeviceType tinyint,UserName nvarchar(128),  
  107. ServerName nvarchar(128),  
  108. DatabaseName nvarchar(128),  
  109. DatabaseVersion int,  
  110. DatabaseCreationDate datetime,  
  111. BackupSize numeric(20,0),  
  112. FirstLSN numeric(25,0),  
  113. LastLSN numeric(25,0),  
  114. CheckpointLSN numeric(25,0),  
  115. DatabaseBackupLSN numeric(25,0),  
  116. BackupStartDate datetime,  
  117. BackupFinishDate datetime,  
  118. SortOrder smallint,  
  119. CodePage smallint,  
  120. UnicodeLocaleId int,  
  121. UnicodeComparisonStyle int,  
  122. CompatibilityLevel tinyint,  
  123. SoftwareVendorId int,  
  124. SoftwareVersionMajor int,  
  125. SoftwareVersionMinor int,  
  126. SoftwareVersionBuild int,  
  127. MachineName nvarchar(128),  
  128. Flags int,BindingID uniqueidentifier,  
  129. RecoveryForkID uniqueidentifier,  
  130. Collation nvarchar(128),  
  131. FamilyGUID uniqueidentifier,  
  132. HasBulkLoggedData bit,  
  133. IsSnapshot bit,  
  134. IsReadOnly bit,  
  135. IsSingleUser bit,  
  136. HasBackupChecksums bit,  
  137. IsDamaged bit,  
  138. BeginsLogChain bit,  
  139. HasIncompleteMetaData bit,  
  140. IsForceOffline bit,  
  141. IsCopyOnly bit,  
  142. FirstRecoveryForkID uniqueidentifier,  
  143. ForkPointLSN numeric(25,0) NULL,  
  144. RecoveryModel nvarchar(60),  
  145. DifferentialBaseLSN numeric(25,0) NULL,  
  146. DifferentialBaseGUID uniqueidentifier,BackupTypeDescription nvarchar(60),  
  147. BackupSetGUID uniqueidentifier NULL,  
  148. CompressedBackupSize numeric(20,0))  
  149.       
  150.      
  151. Insert Into @BakHeaderInfo  
  152.    Exec sp_executesql N'Restore HeaderOnly From [email protected]',N'@DatabBaseBakPath nvarchar(260)',@DatabBaseBakPath  
  153.    
  154.       
  155.  If Isnull(@NewDataBaseName,'')>'' --使用新的数据库名,要是沒有指定就使用原來的数据库名  
  156.         Set @[email protected]  
  157. Else  
  158.     Begin    
  159.         Select @DataBaseName=DatabaseName From @BakHeaderInfo  
  160.     End  
  161.    
  162.       
  163.     Set @Enter=char(13)+Char(10)  
  164.     Select @Sql=Isnull(@[email protected],'')+'Kill '+Rtrim(spid) From master.sys.sysprocesses Where dbid=db_id(@DataBaseName)  
  165.     Exec(@Sql)  
  166.       
  167.     Set @Sql=N'Restore DataBase @DataBaseName From [email protected] With File=??,' --+(Select 'File='+rtrim(max(Position))+', ' From @BakHeaderInfo)  
  168.    
  169.     Select  @[email protected]+'Move '''+LogicalName+''' To '''[email protected]+'\'[email protected]+  
  170.             Case  
  171.                 When [Type]='D' And Not Exists(Select 1 From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) Then ''  
  172.                 When [Type]='D' Then '_'+(Select Rtrim(Count(*)) From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID)  
  173.                 When [Type]='L' And Not Exists(Select 1 From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) Then '_Log'  
  174.                 When [Type]='L' Then '_Log'+(Select Rtrim(Count(*)) From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID)  
  175.                 Else ''  
  176.             End+Right(PhysicalName,Charindex('.',Reverse(PhysicalName)))+''',',  
  177.             @SqlDatabaseRename=Isnull(@[email protected],'')+  
  178.             Case  
  179.                 When [Type]='D' And [email protected] Then ''  
  180.                 When [Type]='D' And LogicalName Like @DataBaseName+'[_]%' Then ''  
  181.                 When [Type]='L' And LogicalName Like @DataBaseName+'[_]Log%' Then ''  
  182.                 When [Type]='F' Then ''  
  183.              Else  
  184.                 'Alter DataBase '+Quotename(@DataBaseName)+' Modify File(Name='''+LogicalName+''',NewName='''[email protected]+  
  185.            Case  
  186.                When [Type]='D' And Not Exists(Select 1 From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) Then ''  
  187.                When [Type]='D' Then '_'+(Select Rtrim(Count(*)) From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID)  
  188.                When [Type]='L' And Not Exists(Select 1 From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) Then '_Log'  
  189.                When [Type]='L' Then '_Log'+(Select Rtrim(Count(*)) From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID)  
  190.                Else ''  
  191.                 End+''')'  
  192.                 End  
  193.     From @BakFileList As a  
  194.     Set @[email protected]+'Replace'  
  195.       
  196.     If @Keep_Replication=1  
  197.         Set @[email protected]+'Keep_Replication'  
  198.       
  199.     Declare @sql1 nvarchar(max),  
  200.             @MaxPosition int  
  201.       
  202.     Select @MaxPosition=Position  
  203.         From @BakHeaderInfo As a  
  204.         Where a.BackupType=1  
  205.     And Not Exists(Select 1 From @BakHeaderInfo Where BackupType=a.BackupType And Position>a.Position)  
  206.       
  207.       
  208.     Select @sql1=isnull(@sql1+char(13)+char(10),'')+replace(@sql,'??',rtrim(Position)) +  
  209.             Case When Exists(Select 1 From @BakHeaderInfo Where Position>a.Position) Then N',Norecovery' Else N',Recovery' End  
  210.         From @BakHeaderInfo As a  
  211.         Where Position>[email protected]  
  212.         Order By Position  
  213.           
  214.     Print '还原数据库: '[email protected]  
  215.    
  216.       
  217. --    Print @sql1  
  218.     Exec sp_executesql @sql1,N'@DataBaseName nvarchar(128),@DatabBaseBakPath nvarchar(260)',@DataBaseName,@DatabBaseBakPath  
  219.    
  220.     If @SqlDatabaseRename>''  
  221.         Exec(@SqlDatabaseRename)  
  222.    
  223. End Try  
  224. Begin Catch  
  225.     Declare @Error nvarchar(1024)  
  226.     Set @Error=ERROR_MESSAGE()  
  227.     Raiserror 50001 @Error  
  228.     Return 1  
  229. End Catch  
  230.     Set Nocount Off  
  231.    
  232.    
  233. Go  
  234.   
  235.    

存储过程测试:

      
[sql] view plain copy
 
 print?
  1. use master   Go   
  2.  Exec dbo.sp_RestoreDataBase 'E:\DBBackup\dbA2011-09-05.bak','E:\DATA\SQL2008DE01'  
  3. go  

 

image

 

 

 

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


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

    

[sql] view plain copy
 
 print?
  1. if object_id('sp_restoredatabase2'Is Not Null  
  2.     Drop proc sp_restoredatabase2  
  3. Go  
  4. create proc sp_restoredatabase2  
  5. (  
  6.     @Path_bak nvarchar(1024),  
  7.     @Path_new nvarchar(1024)=null,  
  8.     @DataBaseList nvarchar(max)=null  
  9. )  
  10. As  
  11. /*  
  12.   
  13. @DataBaseList 数据库列表,可留空,或数据库之间使用回车、空格、逗号分隔都ok  
  14.   
  15. */  
  16.   
  17.   
  18. Set Nocount On  
  19. Declare @subdirectory nvarchar(1024),@ErrorMsg nvarchar(1024),@flag smallint  
  20.   
  21. if isnull(@Path_new,'')=''          
  22.     exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', @Path_new Output      
  23.   
  24.   
  25. If Not Exists(Select 1 From master.sys.procedures Where name='sp_RestoreDataBase')  
  26. Begin  
  27.     Raiserror 50001 N'找不到存储过程 sp_RestoreDataBase '  
  28.     Goto ExitFLag  
  29. End  
  30.   
  31.   
  32. Declare @Dir Table(subdirectory nvarchar(1024),depth int,[file] int)  
  33. Declare @DBList table (DatabaseName nvarchar(128))  
  34. Declare @DBListNull table (DatabaseName nvarchar(128))  
  35.   
  36. /*  
  37. --SQL Server 2005  
  38. 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)  
  39. */  
  40. --SQL Server 2008  
  41. 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))  
  42.   
  43.       
  44.   
  45.   
  46. While charindex(char(13)+Char(10),@DataBaseList)>0  
  47.     Set @DataBaseList=Replace(@DataBaseList,char(13)+Char(10),',')  
  48. While charindex(char(13),@DataBaseList)>0  
  49.     Set @DataBaseList=Replace(@DataBaseList,char(13),',')  
  50. While charindex(char(9),@DataBaseList)>0  
  51.     Set @DataBaseList=Replace(@DataBaseList,char(9),',')  
  52. While charindex(char(32),@DataBaseList)>0  
  53.     Set @DataBaseList=Replace(@DataBaseList,Char(32),',')  
  54.   
  55.           
  56. Set @DataBaseList='Select '''+Replace(@DataBaseList,',',''' Union All Select ''')+''''  
  57. Insert Into @DBList  Exec(@DataBaseList)  
  58.   
  59. Delete @DBList Where DatabaseName =''  
  60.   
  61. Insert Into @Dir Exec xp_dirtree @Path_bak,1,1  
  62.   
  63. If Not Exists(Select subdirectory From @Dir Where Charindex('.bak',subdirectory)>0)  
  64. Begin  
  65.     Set @ErrorMsg= N'无效的数据库路径: '+ rtrim(@Path_bak)  
  66.     Raiserror 50001 @ErrorMsg  
  67.     Goto ExitFlag  
  68. End  
  69.   
  70.   
  71.   
  72. Declare cur_x cursor For Select subdirectory From @Dir Where Charindex('.bak',subdirectory)>0  
  73. Open cur_x  
  74. Fetch Next From cur_x Into @subdirectory  
  75. While @@Fetch_status=0  
  76. Begin  
  77.       
  78.     Set @subdirectory=Case When Right(@Path_bak,1)='\' Then @Path_bak Else   @Path_bak+'\' End[email protected]  
  79.       
  80.     Delete From @BakHeaderTMP  
  81.   
  82.     Insert Into @BakHeaderTMP  
  83.         Exec sp_executesql N'Restore HeaderOnly From [email protected]',N'@DatabBaseBakPath nvarchar(260)',@subdirectory  
  84.           
  85.     IF @@ERROR <> 0              
  86.         Break  
  87.     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))          
  88.         Begin  
  89.             Exec @flag=sp_RestoreDataBase @subdirectory,@Path_new              
  90.             If @flag <>0 Break  
  91.         End  
  92.   
  93.     Insert Into @DBListNull(DatabaseName)  
  94.         Select DatabaseName From @BakHeaderTMP      
  95.                           
  96.     Fetch Next From cur_x Into @subdirectory  
  97. End  
  98. CLose cur_x  
  99. Deallocate cur_x  
  100.   
  101.   
  102.   
  103. If Exists(Select 1 From @DBList a Where Not Exists(Select 1 From @DBListNull Where DatabaseName=a.DatabaseName))  
  104.     Select DatabaseName As [无效的数据库] From @DBList a Where Not Exists(Select 1 From @DBListNull Where DatabaseName=a.DatabaseName)  
  105.   
  106. print replicate('=',60)  
  107. Print N'@Path_new :  '[email protected]_new  
  108.   
  109. ExitFLag:  
  110.   
  111. Go  

 

 

存储过程测试:

 

image

 

 

 

小结


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

大家都在看

回到顶部

下载声明 | 法律声明 | 版权声明 | 发布软件 | 网站地图

本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件给 [email protected]