1 CREATE proc [dbo].[usp_autoBackupDB] 2 @dbname sysname=null --要備份的數據庫名,不指定即為全部備份 3 ,@path nvarchar(128)='d:\' --備份目錄路徑 4 ,@backup_type varchar(16)='database' --備份類型,可以為database,log 5 ,@backup_sysdb int=0 --是否備份系統數據庫,0為不備份,1為備份 6 as 7 set nocount on; 8 9 declare @dbcnt int =0 10 ,@sql varchar(2000)='' 11 ,@except_db varchar(1000)=case @backup_sysdb 12 when 0 then ''''+'master'+''''+','+'''' +'msdb'+''''+','+''''+'tempdb'+''''+','+''''+'model'+'''' 13 when 1 then '' end; 14 declare @db_list table(id int identity(1,1) not null,name sysname); 15 declare @backup_err_list table(id int identity(1,1) not null,name sysname); 16 if right(@path,1)<>'\' 17 set @path=@path+'\' 18 19 if @dbname is null or @dbname in ('all','*') 20 begin 21 --將所有數據庫名存到一張臨時表上 22 set @sql='select name from sys.databases where name not in ('+@except_db+');' 23 insert into @db_list(name) exec(@sql); 24 25 --得到一共有多少個數據庫 26 select @dbcnt=count(1) from @db_list; 27 --開始循環 28 while @dbcnt>0 29 begin 30 --從臨時表中獲得最后一個數據庫的名字 31 select @dbname=name from @db_list where id=@dbcnt; 32 set @sql='backup '+@backup_type+' '+@dbname+' to disk='+''''+@path+@backup_type+'_'+@dbname+'.'+convert(varchar(8),getdate(),112)+'.'+DATENAME(HH,GETDATE())+'''' 33 --開始循環備份 34 exec (@sql); 35 if @@ERROR<>0 36 insert into @backup_err_list(name) values(@dbname); 37 set @dbcnt=@dbcnt-1 38 end 39 end 40 else 41 begin 42 set @sql='backup '+@backup_type+' '+@dbname+' to disk='+''''+@path+@backup_type+'_'+@dbname+'.'+convert(varchar(8),getdate(),112)+'.'+DATENAME(HH,GETDATE())+'''' 43 --僅備份一次 44 exec (@sql); 45 if @@ERROR<>0 46 insert into @backup_err_list(name) values(@dbname); 47 48 end 49 if exists(select * from @backup_err_list) 50 select ID ,name as 'backup_err_dbname' from @backup_err_list; 51 else print 'backup success'; 52 53 set nocount off; 54 55 GO