CREATE proc [dbo].[usp_autoBackupDB]
@dbname sysname=null --要備份的數據庫名,不指定即爲全部備份
,@path nvarchar(128)='d:\' --備份目錄路徑
,@backup_type varchar(16)='database' --備份類型,可以爲database,log
,@backup_sysdb int=0 --是否備份系統數據庫,0爲不備份,1爲備份
as
set nocount on;
declare @dbcnt int =0
,@sql varchar(2000)=''
,@except_db varchar(1000)=case @backup_sysdb
when 0 then ''''+'master'+''''+','+'''' +'msdb'+''''+','+''''+'tempdb'+''''+','+''''+'model'+''''
when 1 then '' end;
declare @db_list table(id int identity(1,1) not null,name sysname);
declare @backup_err_list table(id int identity(1,1) not null,name sysname);
if right(@path,1)<>'\'
set @path=@path+'\'
if @dbname is null or @dbname in ('all','*')
begin
--將所有數據庫名存到一張臨時表上
set @sql='select name from sys.databases where name not in ('+@except_db+');'
insert into @db_list(name) exec(@sql);
--得到一共有多少個數據庫
select @dbcnt=count(1) from @db_list;
--開始循環
while @dbcnt>0
begin
--從臨時表中獲得最後一個數據庫的名字
select @dbname=name from @db_list where id=@dbcnt;
set @sql='backup '+@backup_type+' '+@dbname+' to disk='+''''+@path+@backup_type+'_'+@dbname+'.'+convert(varchar(8),getdate(),112)+'.'+DATENAME(HH,GETDATE())+''''
--開始循環備份
exec (@sql);
if @@ERROR<>0
insert into @backup_err_list(name) values(@dbname);
set @dbcnt=@dbcnt-1
end
end
else
begin
set @sql='backup '+@backup_type+' '+@dbname+' to disk='+''''+@path+@backup_type+'_'+@dbname+'.'+convert(varchar(8),getdate(),112)+'.'+DATENAME(HH,GETDATE())+''''
--僅備份一次
exec (@sql);
if @@ERROR<>0
insert into @backup_err_list(name) values(@dbname);
end
if exists(select * from @backup_err_list)
select ID ,name as 'backup_err_dbname' from @backup_err_list;
else print 'backup success';
set nocount off;
GO