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...