2个答案
声明@fileListTable表 ( LogicalName nvarchar(128), 物理名称nvarchar(260), [类型]字符(1), 文件组名称nvarchar(128), 大小数字(20.0), 最大大小数值(20,0), 文件ID bigint, CreateLSN数字(25.0), DropLSN数字(25.0), 唯一ID唯一标识符, 只读LSN数字(25.0), 读写LSN数字(25.0), 备份大小InBytes bigint, SourceBlockSize整数, 文件组ID int, 日志组GUID唯一标识符, DifferentialBaseLSN数字(25.0), DifferentialBaseGUID唯一标识符, IsReadOnl位, IsPresent位, TDEThumbprint varbinary(32) ) 插入@fileListTable exec('从磁盘还原filelistonly=''C:\Share\BackUp\Reporting\Prod23.bak'')--听到我从备份中获取所有文件 从@fileListTable中选择* 声明@sctript nvarchar(最大值) 选择 @sctript='从磁盘还原数据库Prod=''C:\Share\BackUp\Reporting\Prod23.bak''WITH FILE=1,'+ STUFF((选择结果.MoveTo+',' 来自 ( 选择 “将“”+LogicalName+“”移动到“E:\MobiledbnkDB_Report”+LogicalName+ 案例[类型] 当“D”然后为“.mdf”时 当“L”然后“.ldf”时 end+“”作为MoveTo FROM@fileListTable——将I模式文件收听到另一个文件夹 )作为结果 对于XML路径(“”), 1, 0, '') +'空载,统计数据=5' 使用主控形状 如果存在(SELECT*FROM sys.databases d WITH(NOLOCK)where d.name='Prod') 开始 使用立即回滚更改数据库Prod set restricted_user 删除数据库产品 结束 打印@sctript 执行(@sctript)
声明@BackupFolder nvarchar(100)=N'FILELOCATION' 声明@BackupDirectory SYSNAME=@BackupFolder 如果OBJECT_ID('tempdb..#DirTree')不为空 删除表#DirTree 创建表#DirTree( Id int标识(1,1), 子目录nvarchar(255), 深度smallint, 文件标志位, ParentDirectoryID int ) 插入#DirTree(子目录、深度、文件标志) EXEC主机。。 xp_dirtree@BackupDirectory,10,1 更新#DirTree 设置ParentDirectoryID=( 从#DirTree d2选择最大(Id) 其中深度=d.深度-1和d2.Id<d.Id ) 来自#DirTree d 声明 @ID内景, @备份文件VARCHAR(MAX), @深度TINYINT, @文件标志位, @父目录ID INT, @wkSubParentDirectoryID INT, @wk子目录VARCHAR(最大) 声明@备份文件表 ( 文件名路径VARCHAR(MAX), TransLogFlag自检, 备份文件VARCHAR(MAX), 数据库名称VARCHAR(MAX) ) 声明文件光标光标本地FORWARD_ONLY FOR 选择*FROM#DirTree WHERE FileFlag=1 打开文件光标 将下一个从FileCursor获取到 @ID、, @备份文件, @深度, @文件标志, @父目录ID SET@wkSubParentDirectoryID=@ParentDirectoriID WHILE@@FETCH_STATUS=0时 开始 --循环以反向生成路径,从备份文件开始,然后在循环中为子文件夹添加前缀 当@wkSubParentDirectoryID不为空时 开始 SELECT@wkSubDirectory=子目录,@wkSupParentDirectoryID=父目录ID FROM#目录树 WHERE ID=@wkSubParentDirectoryID SELECT@BackupFile=@wkSubDirectory+“\”+@BackupFile 结束 SELECT@BackupFile=@BackupDirectory+@BackupFile 插入@BackupFiles(FileNamePath)值(@BackupFile) 将下一个从FileCursor获取到 @ID、, @备份文件, @深度, @文件标志, @父目录ID SET@wkSubParentDirectoryID=@ParentDirectoryID 结束 关闭文件光标 取消分配文件光标 从#DirTree中选择@BackupFolder+“\”+子目录 声明@filecount int=(从#DirTree中选择count(*)) 声明@sctript nvarchar(最大值) 选择 @sctript='从中恢复数据库rrreality'+ STUFF((SELECT+','+结果.MoveTo 来自 ( 选择“DISK=N”+“FILELOCATION”+子目录+“”作为MoveTo FROM#DirTree—将I模式文件收听到另一个文件夹 )作为结果 对于XML路径(“”), 1,1,“)+”,文件=1 将N''file''移动到N''file.mdf'', 将N''file_Log''移动到N''L:\filelog.ldf'', 空载,更换,状态=5' 执行(@sctript)