create   PROCEDURE  GY_DBBak  
          @bakequip    int,         --  备份设备:磁盘&磁带  
          @bakpath     varchar(50), --  带全路径的备份文件名  
          @baktype     int,         --  完全备份&增量备份  
          @baklog      int,         --  ‘0’备份日志  
          @bakdb       int,         --  ‘0’备份数据库  
          @kind  varchar(7),        --备份还是恢复  
          
  @retmsg  varchar(20)  output     --返回信息  
AS  
   DECLARE  @DevName_data    varchar(50)  
   DECLARE  @DevName_log   varchar(50)
   declare @db_path varchar(100)
   declare @log_path varchar(100)
       
   DECLARE  @RC INT     SELECT    @db_path    =  @bakpath    +  '.dat'  
SELECT    @log_path   =  @bakpath    +  'log.dat'  
        SELECT    @RC=0   DBCC  CHECKDB(Northwind)  
/***********************************************************
** CREATE BACKUP AND RESTORE DEVICES
************************************************************/
IF @RC=0
   BEGIN

    EXEC sp_addumpdevice 'disk', @DevName_data,@db_path

exec sp_addumpdevice 'disk', @DevName_log,@log_path
    select @rc=@@error
IF @RC<>0
begin
EXEC SP_DropDevice @Devname_data
exec sp_dropdevice @devname_log
SELECT @RC=-1000
return @rc
end
  END

   IF  @kind='backup'  
   BEGIN  
       IF  @bakequip=0  
       BEGIN  
           IF  @baktype=0  
           BEGIN  
               IF  @bakdb=0  
               BEGIN    
                   BACKUP  DATABASE  Northwind  TO  DISK=@Devname_data   
                   WITH  INIT  
               END  
               IF  @baklog=0  
               BEGIN              
                   BACKUP  LOG  Northwind  WITH  NO_LOG              
                   BACKUP  LOG  Northwind  TO  DISK=@DevName_log 
                   WITH  INIT,NO_TRUNCATE  
               END  
           END  
           ELSE  BEGIN  
               IF  @bakdb=0  
               BEGIN  
                   BACKUP  DATABASE  Northwind  TO  DISK=@DevName_data
                   WITH  NOINIT  
               END  
               IF  @baklog=0  
               BEGIN  
                   BACKUP  LOG  Northwind  WITH  NO_LOG              
                   BACKUP  LOG  Northwind  TO  DISK=@DevName_log 
                   WITH  NOINIT,NO_TRUNCATE  
               END  
           END          
       END  
       SELECT  @retmsg='数据库备份成功!'  
   END  
 
   IF  @kind='restore'      
   BEGIN  
       RESTORE  DATABASE  Northwind  FROM  DISK=  @DevName_data WITH  REPLACE  
       SELECT  @retmsg='恢复数据库成功!'  
   END  
 
   RETURN  0  -----------------------------------
CREATE PROCEDURE dt_databasebackup @str_backuppath varchar(255),@str_databasename varchar(50),@str_tablename varchar(50) AS
declare @str_sqlexecute varchar(255)
if @str_tablename=‘‘or @str_tablename=null
    begin
        declare backuptable_cursor cursor for
                select sysobjects.name from sysobjects where sysobjects.type=‘U‘
        open backuptable_cursor
        fetch next from backuptable_cursor into @str_tablename
        while @@fetch_status=0
        begin
             select @str_sqlexecute=‘bcp ‘+@str_databasename+‘..‘+@str_tablename+‘ out ‘+ @str_backuppath+‘\‘+@str_tablename+‘.bac -c -U sa -P‘
             exec master..xp_cmdshell @str_sqlexecute
             fetch next from backuptable_cursor into @str_tablename
        end
        deallocate backuptable_cursor
     end
else
    begin
         select @str_sqlexecute=‘bcp ‘+@str_databasename+‘..‘+@str_tablename+‘ out ‘+ @str_backuppath+‘\‘+@str_tablename+‘.bac -c -U sa -P‘
         exec master..xp_cmdshell @str_sqlexecute
    end
--数据库数据备份存储过程
go
CREATE PROCEDURE dt_databaserestore @str_restorepath varchar(255),@str_databasename varchar(50),@str_tablename varchar(50) AS
declare @str_sqlexecute varchar(255)
if @str_tablename=‘‘ or @str_tablename=null
     begin
           declare restoretable_cursor cursor for
                   select sysobjects.name from sysobjects where sysobjects.type=‘U‘
           open restoretable_cursor
           fetch next from restoretable_cursor into @str_tablename
           while @@fetch_status=0
                begin
                     select @str_sqlexecute=‘truncate table ‘+@str_tablename
                     execute(@str_sqlexecute)
                     select @str_sqlexecute=‘bcp ‘+@str_databasename+‘..‘+@str_tablename+‘ in ‘+ @str_restorepath+‘\‘+@str_tablename+‘.bac -c -U sa -P‘
                     exec master..xp_cmdshell @str_sqlexecute
                     fetch next from restoretable_cursor into @str_tablename
                end
          deallocate restoretable_cursor
     end
else
     begin
           select @str_sqlexecute=‘truncate table ‘+@str_tablename
           execute(@str_sqlexecute)
           select @str_sqlexecute=‘bcp ‘+@str_databasename+‘..‘+@str_tablename+‘ in ‘+ @str_restorepath+‘\‘+@str_tablename+‘.bac -c -U sa -P‘
     end
--数据库数据恢复存储过程
go

解决方案 »

  1.   

    还原整个数据库:RESTORE DATABASE { database_name | @database_name_var } 
    [ FROM < backup_device > [ ,...n ] ] 
    [ WITH
        [ RESTRICTED_USER ]
        [ [ , ] FILE = { file_number | @file_number } ]
        [ [ , ] PASSWORD = { password | @password_variable } ]
        [ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
        [ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
        [ [ , ] MOVE 'logical_file_name' TO 'operating_system_file_name' ]
                [ ,...n ]
        [ [ , ] KEEP_REPLICATION ]
        [ [ , ] { NORECOVERY | RECOVERY | STANDBY = undo_file_name } ]
        [ [ , ] { NOREWIND | REWIND } ]
        [ [ , ] { NOUNLOAD | UNLOAD } ]
        [ [ , ] REPLACE ]
        [ [ , ] RESTART ]
        [ [ , ] STATS [ = percentage ] ] 
    ]执行时当然不能连接自己了,连master
      

  2.   

    to:pengdali(大力) 
    先谢谢
    你后两个存储过程,我应该使用过,它门是把表从sysobject先读出来,才一个一个备份,我现在想只是把数据库全部备份成一个.bak的文件,然后用这个.bak 的文件可以做数据倒入,
    我先试试,你给我的第一个存储过程,看可否满足我的需求.
    再次谢过!!!