恢復指定目錄下的所有資料庫 sql

2021-09-08 03:37:19 字數 3589 閱讀 8109

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[p_restoredb]') and objectproperty(id, n'isprocedure') = 1)

drop procedure [dbo].[p_restoredb]

go/*--恢復指定目錄下的所有資料庫

恢復的資料庫名為備份檔案名(不含副檔名)

備份檔案的副檔名固定為.bak

--鄒建 2003.10(引用請保留此資訊)--*/

/*--呼叫示例

--恢復指定目錄下的所有資料庫

exec p_restoredb @bkpath='c:\'

--恢復指定目錄下的指定資料庫

exec p_restoredb @bkpath='c:\',@bkfile='客戶資料,xzkh_new'

--*/

create proc p_restoredb

@bkpath nvarchar(1000)='',     --定義備份檔案的存放目錄,預設為sql的備份目錄

@bkfile nvarchar(4000)='',    --定義要恢復的備份檔案名,不含副檔名

@dbpath nvarchar(260)='',    --恢復後的資料庫存放目錄,不指定則為sql的預設資料目錄

@overexist bit=1,              --是否覆蓋已經存在的資料庫,僅@retype為'db'/'dbnor'是有效

@killuser bit=1                   --是否關閉使用者使用程序,僅@overexist=1時有效

asdeclare @sql varchar(8000),@dbname sysname

if isnull(@bkpath,'')=''

begin

select @bkpath=rtrim(reverse(filename)) from master..sysfiles where name='master'

select @bkpath=substring(@bkpath,charindex('\',@bkpath)+1,4000)

,@bkpath=reverse(substring(@bkpath,charindex('\',@bkpath),4000))+'backup\'

endelse if right(@bkpath,1)<>'\' set @bkpath=@bkpath+'\'

--得到恢復後的資料庫存放目錄

if isnull(@dbpath,'')=''

begin

select @dbpath=rtrim(reverse(filename)) from master..sysfiles where name='master'

select @dbpath=reverse(substring(@dbpath,charindex('\',@dbpath),4000))

endelse if right(@dbpath,1)<>'\' set @dbpath=@dbpath+'\'

--得到指定目錄下的所有備份檔案

create table #t(fname varchar(260),depth int,isf bit)

insert into #t exec master..xp_dirtree @bkpath,1,1

if isnull(@bkfile,'')=''

declare tb cursor local for select fn=left(fname,patindex('%.bak',fname)-1) from #t

where isf=1 and fname like '%.bak'  --取.bak檔案

else

begin

set @bkfile=','+replace(@bkfile,',','.bak,')+'.bak,'

declare tb cursor local for select fn=left(fname,patindex('%.bak',fname)-1) from #t

where isf=1 and fname like '%.bak' and @bkfile like '%,'+fname+',%'

end--恢復資料庫處理

open tb

fetch next from tb into @dbname

while @@fetch_status=0

begin

--生成資料庫恢復語句

set @sql='restore database ['+@dbname

+'] from disk='''+@bkpath+@dbname+'.bak'''

+' with recovery'

+case when @overexist=1 then ',replace' else '' end

--新增移動邏輯檔案的處理

--從備份檔案中獲取邏輯檔名

declare @lfn nvarchar(128),@tp char(1),@i int

--建立臨時表,儲存獲取的資訊

create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),msz numeric(20,0))

--從備份檔案中獲取資訊

insert into #tb exec('restore filelistonly from disk='''+@bkpath+@dbname+'.bak''')

declare #f cursor local for select ln,tp from #tb order by tp

open #f

fetch next from #f into @lfn,@tp

set @i=0

while @@fetch_status=0

begin

select @sql=@sql+',move '''+@lfn+''' to '''+@dbpath+@dbname+cast(@i as varchar)

+case @tp when 'd' then '.mdf''' else '.ldf''' end

,@i=@i+1

fetch next from #f into @lfn,@tp

endclose #f

deallocate #f

drop table #tb

--關閉使用者程序處理

if @overexist=1 and @killuser=1

begin

declare hcforeach cursor for

select s='kill '+cast(spid as varchar) from master..sysprocesses

where dbid=db_id(@dbname)

exec sp_msforeach_worker '?'

end--恢復資料庫

exec(@sql)

fetch next from tb into @dbname

endclose tb

deallocate tb

go

恢復指定目錄下的所有資料庫 sql

if exists select from dbo.sysobjects where id object id n dbo p restoredb and objectproperty id,n isprocedure 1 drop procedure dbo p restoredb go 恢復指定...

C 批量附加指定目錄下的所有資料庫檔案到資料庫中

應用場合 因為經常更換作業系統,所以d盤存放資料庫檔案目錄的資料庫每次都要乙個乙個的附加到mssql中,因此設計程式批量附加省時間也方便自己和大家。程式不足 沒有去研究跟實現ndf日誌檔案附加和多個日誌檔案的資料庫附加。程式原始碼 迴圈查詢指定目錄下要附加的資料庫檔案和對應的日誌檔案,連線本地資料庫...

刪除指定目錄下的所有svn目錄

windows registry editor version 5.00 hkey local machine software classes folder shell deletesvn delete svn folders hkey local machine software classes...