EXECUTE sp_msforeachdb 'USE [?] IF DB_NAME() NOT IN(''master'',''msdb'',''tempdb'',''model'') 
BACKUP DATABASE [?] TO DISK = ''d:\?_'+CONVERT(NVARCHAR(8),getdate(),112) + '.bak'' WITH INIT'这个
CONVERT(NVARCHAR(8),getdate(),112) 貌似拼接有问题。EXECUTE sp_msforeachdb 'USE [?] IF DB_NAME() NOT IN(''master'',''msdb'',''tempdb'',''model'') 
BACKUP DATABASE [?] TO DISK = ''d:\?_12312321.bak'' WITH INIT'  这样是对的。
求解怎么拼?

解决方案 »

  1.   

    别纠结了DECLARE @SQL NVARCHAR(4000)  
    DECLARE @path NVARCHAR(4000) 
    set @path='D:\' 
    SET NOCOUNT ON; 
        
      DECLARE @name  nvarchar(50); 
        
      
        
      DECLARE vendor_cursor CURSOR FOR  
    SELECT name 
    FROM sys.databases 
    WHERE database_id NOT IN (1,2,3,4) 
      
      OPEN vendor_cursor 
        
      FETCH NEXT FROM vendor_cursor  
      INTO @name 
        
      WHILE @@FETCH_STATUS = 0 
      BEGIN 
        SET @sql='BACKUP DATABASE '+ @name+' TO DISK='+''''+@path+@name+CONVERT(VARCHAR(8),GETDATE(),112)+'.bak''' 
          exec (@sql) 
          FETCH NEXT FROM vendor_cursor  
          INTO @name
      END 
      CLOSE vendor_cursor; 
      DEALLOCATE vendor_cursor;
      

  2.   

    完善一下DECLARE @SQL NVARCHAR(4000)  
    DECLARE @path NVARCHAR(4000) 
    set @path='D:\' 
    SET NOCOUNT ON; 
        
      DECLARE @name  nvarchar(50); 
        
      
        
      DECLARE vendor_cursor CURSOR FOR  
    SELECT name 
    FROM sys.databases 
    WHERE database_id NOT IN (1,2,3,4) 
      
      OPEN vendor_cursor 
        
      FETCH NEXT FROM vendor_cursor  
      INTO @name 
        
      WHILE @@FETCH_STATUS = 0 
      BEGIN 
        SET @sql='BACKUP DATABASE '+ @name+' TO DISK='+''''+@path+@name+'_'+CONVERT(VARCHAR(8),GETDATE(),112)+'.bak''' 
          exec (@sql) 
          FETCH NEXT FROM vendor_cursor  
          INTO @name
      END 
      CLOSE vendor_cursor; 
      DEALLOCATE vendor_cursor;
      

  3.   

    create proc Backup_Script
    as 
    DECLARE @SQL NVARCHAR(4000)  
    DECLARE @path NVARCHAR(4000) 
    set @path='D:\' 
    SET NOCOUNT ON; 
        
      DECLARE @name  nvarchar(50); 
        
      
        
      DECLARE vendor_cursor CURSOR FOR  
    SELECT name 
    FROM sys.databases 
    WHERE database_id NOT IN (1,2,3,4) 
      
      OPEN vendor_cursor 
        
      FETCH NEXT FROM vendor_cursor  
      INTO @name 
        
      WHILE @@FETCH_STATUS = 0 
      BEGIN 
        SET @sql='BACKUP DATABASE '+ @name+' TO DISK='+''''+@path+@name+'_'+CONVERT(VARCHAR(8),GETDATE(),112)+'.bak''' 
          exec (@sql) 
          FETCH NEXT FROM vendor_cursor  
          INTO @name
      END 
      CLOSE vendor_cursor; 
      DEALLOCATE vendor_cursor;
    执行万上面语句后,然后
    exec Backup_Script
      

  4.   


    改成这样就可以了哈,其实主要的问题在于sp_msforeachdb参数,不能接受通过+号,来拼接字符串:declare @sql nvarchar(max)set @sql = 'USE [?] IF DB_NAME() NOT IN(''master'',''msdb'',''tempdb'',''model'') 
    BACKUP DATABASE [?] TO DISK = ''d:\?_'+CONVERT(NVARCHAR(8),getdate(),112) + '.bak'' WITH INIT'--select @sql
    /*
    USE [?] IF DB_NAME() NOT IN('master','msdb','tempdb','model')   BACKUP DATABASE [?] TO DISK = 'd:\?_20131108.bak' WITH INIT
    */EXECUTE sp_msforeachdb @sql
    /*(1 行受影响)
    已为数据库 'ReportServer',文件 'ReportServer' (位于文件 1 上)处理了 424 页。
    已为数据库 'ReportServer',文件 'ReportServer_log' (位于文件 1 上)处理了 1 页。
    BACKUP DATABASE 成功处理了 425 页,花费 0.416 秒(7.981 MB/秒)。
    已为数据库 'ReportServerTempDB',文件 'ReportServerTempDB' (位于文件 1 上)处理了 184 页。
    已为数据库 'ReportServerTempDB',文件 'ReportServerTempDB_log' (位于文件 1 上)处理了 1 页。
    BACKUP DATABASE 成功处理了 185 页,花费 0.420 秒(3.441 MB/秒)。
    已为数据库 'ttt',文件 'master' (位于文件 1 上)处理了 440 页。
    已为数据库 'ttt',文件 'mastlog' (位于文件 1 上)处理了 1 页。
    BACKUP DATABASE 成功处理了 441 页,花费 0.322 秒(10.699 MB/秒)。
    已为数据库 'netdb',文件 'netdb' (位于文件 1 上)处理了 704 页。
    已为数据库 'netdb',文件 'netdb_log' (位于文件 1 上)处理了 1 页。
    BACKUP DATABASE 成功处理了 705 页,花费 1.347 秒(4.088 MB/秒)。
    */