Use master Go If Object_id(’sp_RestoreDataBase’) Is Not Null drop Proc sp_RestoreDataBase Go create Proc sp_RestoreDataBase ( @DataBaseBakPath nvarchar(260), @DataBaseNewPath nvarchar(260) ) As Set Nocount On Declare @Sql nvarchar(max), @DataBase nvarchar(128) Declare @DataBakHeader 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) Declare @DataBakFileList 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) insert Into @DataBakHeader exec sp_executesql N’Restore HeaderOnly From Disk=@DataBaseBakPath’,N’@DataBaseBakPath nvarchar(260)’,@DataBaseBakPath insert Into @DataBakFileList exec sp_executesql N’Restore FileListOnly From Disk=@DataBaseBakPath’,N’@DataBaseBakPath nvarchar(260)’,@DataBaseBakPath select @DataBase=DatabaseName From @DataBakHeader select @Sql=Isnull(@Sql+char(13)+char(10),’’)+’Kill ’+Rtrim(spid) From master.sys.sysprocesses where dbid=db_id(@DataBase) Set @Sql=Isnull(@Sql+char(13)+char(10),’’)+’Restore DataBase @DataBase From Disk=@DataBaseBakPath With ’ select @Sql=@Sql+’Move’’’+LogicalName+’’’ To ’’’+@DataBaseNewPath+’\’+LogicalName+Right(PhysicalName,charindex(’.’,Reverse(PhysicalName)))+’’’,’ From @DataBakFileList Set @Sql=@Sql+’Replace,Stats=10’ Set Nocount Off Print ’还原数据库: ’+@DataBase exec sp_executesql @Sql,N’@DataBase nvarchar(128),@DataBaseBakPath nvarchar(260)’,@DataBase,@DataBaseBakPath |