First I'll give a little background on our situation.Log Shipping and Replication are out, so I am scripting a backup locally, an xcopy to a remote box, and then a restore.In the early stages of this, I'm trying to do 3 databases. 2 of them work fine alone. It's when I add the 3rd one that I have a problem. I noticed that in the 2nd stored procedure that I probably need to take out the WITH REPLACE if I'm dropping it beforehand as well. I don't have time to test it on this box until later tonight. I don't think that's the issue because it was doing the same thing before I added the drop. I'm overwriting the .txt file so I don't have the exact error that it's giving. I believe it's something similar to "Server: Msg 11, Level 16, State 1, Line 0 General network error. Check your network documentation." I believe it also said [SQLSTATE 42000].Now for the code. Props to Tara and the code she's put online.Any help would be appreciated and I'll be glad to help answer questions related to what I've got.1st Step:Agent Job scheduled to call stored procedureEXEC sp_backup_user_dbs32nd Step (The code for that stored procedure is):CREATE PROC sp_backup_user_dbs3ASSET nocount ONDECLARE @Now CHAR(14) -- current date in the form of yyyymmddhhmmssDECLARE @cmd SYSNAME -- stores the dynamically created DOS commandDECLARE @Result INT -- stores the result of the dir DOS commandDECLARE @RowCnt INT -- stores @@ROWCOUNTDECLARE @DBName SYSNAMEDECLARE @filename VARCHAR(200) -- stores the path and file name of the BAK fileDECLARE @loglogical VARCHAR(1000)DECLARE @datalogical VARCHAR(1000)DECLARE @restoreData VARCHAR(255)DECLARE @restoreLog VARCHAR(255)DECLARE @backupFile VARCHAR(255)DECLARE @physicalNameData VARCHAR(255)DECLARE @physicalNameLog VARCHAR(255)DECLARE @physicalNameDataStripped VARCHAR(255)DECLARE @physicalNameLogStripped VARCHAR(255)DECLARE @ExecStr NVARCHAR(4000)DECLARE @strSQL VARCHAR(1000)DECLARE @restoreToDataDir VARCHAR(255)DECLARE @restoreToLogDir VARCHAR(255)DECLARE @path VARCHAR(100)SET @path = 'I:\backupMoveTo14'--we need to delete all the old backup files from the I:\backupMoveTo14 folder-- Build the del commandSELECT @cmd = 'del ' + @path + '*.BAK' + ' /Q /F'--PRINT @cmdEXEC master..xp_cmdshell @cmd,NO_OUTPUTCREATE TABLE #whichdatabase ( dbname SYSNAME NOT NULL )INSERTINTO #whichdatabase ( dbname )SELECT [name]FROM master.dbo.sysdatabasesWHERE [name] IN ( 'db1', 'db2')ORDER BY [name]-- Get the database to be backed upSELECT TOP 1 @DBName = dbnameFROM #whichdatabase SET @RowCnt = @@ROWCOUNT -- Iterate throught the temp table until no more databases need to be backed up WHILE @RowCnt <> 0 BEGIN SELECT @filename = @Path + '\' + @DBName + '.BAK' BEGIN backup log @dbnameWITH truncate_onlyEND-- Backup the databaseBACKUP database @DBName TO disk = @filenameDELETEFROM #whichdatabaseWHERE dbname = @DBName-- Get the database to be backed upSELECT TOP 1 @DBName = dbnameFROM #whichdatabase SET @RowCnt = @@ROWCOUNT -- Let the system rest for 5 seconds before starting on the next backup WAITFOR delay '00:00:05'ENDDROP TABLE #whichdatabase SET nocount OFF BEGIN SET @cmd = '' SET @cmd = 'xcopy I:\backupMoveTo14\*.BAK \\RemoteServer\ /C /Y' EXEC master.dbo.xp_cmdshell @cmdEND BEGINEXEC [RemoteServer].master..usp_restoreDbsFromDir2ENDRETURN 0 GO
3rd Step(the code for the usp_restoreDbsFromDir2 on the remote server):CREATE PROCEDURE usp_restoreDbsFromDir2ASSET NOCOUNT ONDECLARE @dbname varchar(255)DECLARE @loglogical varchar(1000)DECLARE @datalogical varchar(1000)DECLARE @physicalName varchar(255)DECLARE @physicalFileName varchar(255)DECLARE @restoreData varchar(255)DECLARE @restoreLog varchar(255)DECLARE @backupDisk nvarchar (255)DECLARE @physicalNameData varchar(255)DECLARE @physicalNameLog varchar(255)DECLARE @physicalNameDataStripped varchar(255)DECLARE @physicalNameLogStripped nvarchar (255)DECLARE @rowCnt int -- @@ROWCOUNTDECLARE @ExecStr NVARCHAR(4000)DECLARE @strSQL varchar(1000)DECLARE @spidstr varchar(8000)DECLARE @cmd sysnameDECLARE @bkpFile nvarchar(1000)DECLARE @sql nvarchar(4000)DECLARE @restoreDir varchar(255)DECLARE @PhysicalDataPath varchar(255)DECLARE @PhysicalLogPath varchar(255)SET @restoreDir = 'F:\MSSQL\BACKUP\'-- Get files sorted by dateSET @cmd = 'dir ' + @restoreDir + '*.BAK /OD'CREATE TABLE #Dir (DirInfo VARCHAR(7000) ) -- Stores the dir resultsCREATE TABLE #BackupFiles (BackupDate varchar(10), BackupFileName nvarchar(1000) ) -- Stores only the data we want from the dirCREATE TABLE #RestoreFileListOnly ( LogicalName nvarchar(128), PhysicalName nvarchar(260), Type char(1), FileGroupName nvarchar(128), [Size] numeric(20,0), [MaxSize] numeric(20,0) )INSERT INTO #DirEXEC master.dbo.xp_cmdshell @cmdINSERT INTO #BackupFilesSELECT SUBSTRING(DirInfo, 1, 10), SUBSTRING(DirInfo, LEN(DirInfo) - PATINDEX('% %', REVERSE(DirInfo)) + 2, LEN(DirInfo))FROM #DirWHERE ISDATE(SUBSTRING(DirInfo, 1, 10)) = 1 AND DirInfo NOT LIKE '%<DIR>%' -- Get the newest file SELECT TOP 1 @bkpFile = BackupFileName FROM #BackupFiles ORDER BY BackupDate DESC SET @rowCnt = @@ROWCOUNT -- Iterate throught the table until no more databases need to be backed up WHILE @RowCnt <> 0 BEGIN SET @cmd = @restoreDir + @bkpFile INSERT INTO #RestoreFileListOnly EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @cmd + '''') --get the dbname from the bkpFile name --SET @strSQL = CHARINDEX('_db_', @bkpFile) --SET @dbname = LEFT(@bkpFile, @strSQL - 1) SET @strSQL = CHARINDEX('.bak', @bkpFile) SET @dbname = LEFT(@bkpFile, @strSQL - 1) --PRINT @dbname --IF @@ROWCOUNT <> 2 -- RETURN 3 SET @backupDisk = @restoreDir + @bkpFile SELECT @datalogical = LogicalName FROM #RestoreFileListOnly WHERE Type = 'D' SELECT @loglogical = LogicalName FROM #RestoreFileListOnly WHERE Type = 'L' SELECT @PhysicalDataPath = PhysicalName FROM #RestoreFileListOnly WHERE Type = 'D' SELECT @PhysicalLogPath = PhysicalName FROM #RestoreFileListOnly WHERE Type = 'L' SELECT @strSQL = 'alter database ' + @dbname + ' set offline with rollback immediate' --alter database MyDatabase set offline with rollback immediate --PRINT @strSQL EXEC (@strSQL) SELECT @strSQL = 'DROP database ' + @dbname --alter database MyDatabase set offline with rollback immediate --PRINT @strSQL EXEC (@strSQL) --restore the database SELECT @strSQL = '' SELECT @strSQL = @strSQL + 'RESTORE DATABASE ' + @dbname + CHAR(10) SELECT @strSQL = @strSQL + 'FROM DISK = ''' + @backupDisk + '''' + CHAR(10) SELECT @strSQL = @strSQL + 'WITH' + CHAR(10) SELECT @strSQL = @strSQL + CHAR(9) + 'REPLACE' SELECT @strSQL = @strSQL + ',' + CHAR(10) SELECT @strSQL = @strSQL + CHAR(9) + 'MOVE '''+ @datalogical + ''''+ ' TO '''+ @PhysicalDataPath + '''' SELECT @strSQL = @strSQL + ',' + CHAR(10) SELECT @strSQL = @strSQL + CHAR(9) + 'MOVE ''' + @loglogical + '''' + ' TO '''+ @PhysicalLogPath + '''' --PRINT @strSQL EXEC (@strSQL) SELECT @strSQL = 'alter database ' + @dbname + ' set online with rollback immediate' --alter database MyDatabase set offline with rollback immediate --PRINT @strSQL EXEC (@strSQL) BEGIN -- Build the del command SELECT @cmd = 'del ' + @restoreDir + '\' + @bkpFile + ' /Q /F' --PRINT @cmd -- Delete the file EXEC master..xp_cmdshell @cmd, NO_OUTPUT END --This is supposed to remove the row once doneDELETE FROM #BackupFilesWHERE @bkpFile = BackupFileName-- Get the database to be backed upSELECT TOP 1 @bkpFile = BackupFileNameFROM #BackupFilesORDER BY BackupDate DESCSET @rowCnt = @@ROWCOUNT--Wait a couple of seconds before starting the next oneWAITFOR delay '00:00:30'END Drop TABLE #DirDrop TABLE #BackupFilesDrop TABLE #RestoreFileListOnlySET NOCOUNT OFFRETURN 0GO