﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>StrataFrame Forum » StrataFrame Application Framework - V1 » Business Objects and Data Access (How do I?)  » Backup a Database</title><generator>InstantForum 2017-1 Final</generator><description>StrataFrame Forum</description><link>http://forum.strataframe.net/</link><webMaster>StrataFrame Forum</webMaster><lastBuildDate>Tue, 07 Apr 2026 14:24:04 GMT</lastBuildDate><ttl>20</ttl><item><title>Backup a Database</title><link>http://forum.strataframe.net/FindPost15032.aspx</link><description>Chaps,&lt;/P&gt;&lt;P&gt;I want to offer my users a backup routine from my application, which may or may not be on the same machine as SQL Server Express. My users are not SQL Server literate and as such I want to protect them from it as much as I can.&lt;/P&gt;&lt;P&gt;I have a routine from a while ago, that allows the application I have written to backup the SQL Server Express database that it uses. This routine was written for an application that ran on the same machine as SQL Server Express.&lt;/P&gt;&lt;P&gt;Is there any routine built into SF, that will undertake backup and possibly restore? If not, can you advise how I get the Microfour.Strataframe.DBEngine.SQL.SQLServerInfo structure populated? It has everything in it that I need to modify my existing application.&lt;/P&gt;&lt;P&gt;&amp;nbsp;Your advice, as always is appreciated.&lt;/P&gt;&lt;P&gt;regards&lt;/P&gt;&lt;P&gt;Geoff Hirst</description><pubDate>Tue, 15 Apr 2008 13:28:46 GMT</pubDate><dc:creator>Geoff Hirst</dc:creator></item><item><title>RE: Backup a Database</title><link>http://forum.strataframe.net/FindPost15652.aspx</link><description>You would just make a sproc to backup your database(s) (on the server of course) then run it in some BO using the ExecuteNonQuery() method (in the client).  You could simply create a class that inherits BusinessLayer, than add the method:&lt;br&gt;
[codesnippet]Public Class AdminBO&lt;br&gt;
  Inherits BusinessLayer&lt;br&gt;
  Public Sub BackDb()&lt;br&gt;
    '-- Just use a SQL Command object to do the work&lt;br&gt;
    Using cmd As New SqlCommand()&lt;br&gt;
      cmd.CommandType = StoredProcedure&lt;br&gt;
      cmd.CommandText = "BackupDatabase"&lt;br&gt;
      Me.ExecuteNonQuery(cmd)&lt;br&gt;
    End Using&lt;br&gt;
  End Sub&lt;br&gt;
End Class[/codesnippet]</description><pubDate>Tue, 15 Apr 2008 13:28:46 GMT</pubDate><dc:creator>Greg McGuffey</dc:creator></item><item><title>RE: Backup a Database</title><link>http://forum.strataframe.net/FindPost15650.aspx</link><description>[quote]your example for backup and restore is great. Do you have any pointers for actually integrating it into a client that isn't running on the server machine?[/quote]&lt;P&gt;Either create a service that runs on your clients machine or create an external EXE that you run as a scheduled task.&amp;nbsp; The latter is a litte more simple in regards to installations, but the service would be easier in regards to ensuring that it ran regardless of which user is logged into the machine or even logged in at all.&amp;nbsp; But both ways would get the job done.&lt;P&gt;Also, you can change the logic to run from a client.&amp;nbsp; You would then just have the backup update on the local disk of the server (the only way you can do this) and then copy the files up to the network.&amp;nbsp; You could just provide a preference in your app that specified the network path and the UNC path or something to the server to get to the files on disk.</description><pubDate>Tue, 15 Apr 2008 13:26:12 GMT</pubDate><dc:creator>Trent L. Taylor</dc:creator></item><item><title>RE: Backup a Database</title><link>http://forum.strataframe.net/FindPost15646.aspx</link><description>Hi Trent,&lt;/P&gt;&lt;P&gt;your example for backup and restore is great. Do you have any pointers for actually integrating it into a client that isn't running on the server machine?&lt;/P&gt;&lt;P&gt;I keep getting tripped up by this. Having the backup on the server is fine, I would just like the client to be able to run it rather than it be a server invoked task.&lt;/P&gt;&lt;P&gt;thanks &lt;/P&gt;&lt;P&gt;Geoff.</description><pubDate>Tue, 15 Apr 2008 12:58:38 GMT</pubDate><dc:creator>Geoff Hirst</dc:creator></item><item><title>RE: Backup a Database</title><link>http://forum.strataframe.net/FindPost15066.aspx</link><description>On some of our development servers we take an approach more similar to Keith since this is in house.&amp;nbsp; In this case we have a sproc that cycles through all of the databases and backs them up to a network location:&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Stored Sproc Code&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;[codesnippet]CREATE PROCEDURE [dbo].[BackupDatabases]&lt;BR&gt;AS&lt;BR&gt;BEGIN&lt;BR&gt;&amp;nbsp;-- Establish locals&lt;BR&gt;&amp;nbsp;DECLARE @dbid INT;&lt;BR&gt;&amp;nbsp;DECLARE @dbname NVARCHAR(128);&lt;BR&gt;&amp;nbsp;DECLARE @backupPath NVARCHAR(500);&lt;/P&gt;&lt;P&gt;&amp;nbsp;-- Get the first dbid&lt;BR&gt;&amp;nbsp;SELECT @dbid = MIN(dbid) FROM sys.sysdatabases;&lt;/P&gt;&lt;P&gt;&amp;nbsp;-- Cycle through the databases&lt;BR&gt;&amp;nbsp;WHILE @dbid IS NOT NULL&lt;BR&gt;&amp;nbsp;BEGIN&lt;BR&gt;&amp;nbsp;&amp;nbsp;-- Get the database name&lt;BR&gt;&amp;nbsp;&amp;nbsp;SELECT @dbname = [name] FROM sys.sysdatabases WHERE dbid = @dbid;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;-- Only backup the database if it is not tempdb&lt;BR&gt;&amp;nbsp;&amp;nbsp;IF NOT @dbname = 'tempdb'&lt;BR&gt;&amp;nbsp;&amp;nbsp;BEGIN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-- Create the backup path&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT @backupPath = ('C:\SQLBackups\M4SQL_' + @dbname + '.bak');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-- Backup the database&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;BACKUP DATABASE @dbname&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;TO DISK = @backupPath WITH INIT;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-- Backup the log file&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;BACKUP LOG @dbname WITH NO_LOG&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-- Shrink the DB to truncate the logfile&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DBCC SHRINKDATABASE (@dbname, 10)&lt;BR&gt;&amp;nbsp;&amp;nbsp;END&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;-- Get the next database row&lt;BR&gt;&amp;nbsp;&amp;nbsp;SELECT @dbid = MIN(dbid) FROM sys.sysdatabases WHERE dbid &amp;gt; @dbid;&lt;BR&gt;&amp;nbsp;END&lt;BR&gt;END[/codesnippet]&lt;/P&gt;&lt;P&gt;However, this doesn't really work in the field.&amp;nbsp; As Greg mentioned, we use SMO.&amp;nbsp; I have posted a sample of how to do this here: &lt;A href="http://forum.strataframe.net/FindPost15065.aspx"&gt;http://forum.strataframe.net/FindPost15065.aspx&lt;/A&gt;&amp;nbsp;.</description><pubDate>Thu, 20 Mar 2008 10:41:41 GMT</pubDate><dc:creator>Trent L. Taylor</dc:creator></item><item><title>RE: Backup a Database</title><link>http://forum.strataframe.net/FindPost15038.aspx</link><description>This might fall under "cheesy but it works", this is how I backup SQL Express databases. You could probably automate it pretty easily into your app. I have been using it for years and know it works well. Just change the parameters as required. You can set log directory, backup directory, # of copies, rollover, frequency, database name (ALL_USER) for all user databases, etc etc&lt;br&gt;
&lt;br&gt;
I stole all this long ago, hopefully I left the credits in the scripts.&lt;br&gt;
&lt;br&gt;
You will need to run the SQL Express Surface Area Configuration tools to allow the "features" xp_cmdshell and OLE Automation&lt;br&gt;
&lt;br&gt;
Keith&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;&lt;&lt; wouldn't let me attach the file types so here &gt;&gt;&lt;br&gt;
&lt;br&gt;
[b]This line goes in a script file:[/b]&lt;br&gt;
sqlcmd -S.\SQLExpress -i"c:\database backup scripts\backupalldatabases.sql"&lt;br&gt;
&lt;br&gt;
[b]Here is the code for "backupalldatabases.sql" referenced above:[/b]&lt;br&gt;
exec expressmaint&lt;br&gt;
   @database      = 'ALL_USER', &lt;br&gt;
   @optype        = 'DB',&lt;br&gt;
   @backupfldr    = 'c:\SQL Express DB Backups',&lt;br&gt;
   @reportfldr    = 'c:\SQL Express DB Backup Reports',&lt;br&gt;
   @verify        = 1,&lt;br&gt;
   @dbretainunit  = 'days',&lt;br&gt;
   @dbretainval   = 5,&lt;br&gt;
   @rptretainunit = 'weeks',&lt;br&gt;
   @rptretainval  = 1,&lt;br&gt;
   @report        = 1&lt;br&gt;
&lt;br&gt;
[b]Here is the code to create the maintenance sproc on the express instance, just run it once:[/b]&lt;br&gt;
use master&lt;br&gt;
GO&lt;br&gt;
&lt;br&gt;
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[expressmaint]') &lt;br&gt;
           and OBJECTPROPERTY(id, N'IsProcedure') = 1)&lt;br&gt;
drop procedure [dbo].[expressmaint]&lt;br&gt;
GO&lt;br&gt;
&lt;br&gt;
CREATE PROCEDURE expressmaint&lt;br&gt;
(&lt;br&gt;
   @database      sysname,                   -- database name | ALL_USER | ALL_SYSTEM&lt;br&gt;
   @optype        varchar(7),                -- LOG | DB | DIFF | REINDEX | REORG | CHECKDB&lt;br&gt;
   @backupwith    varchar(500) = NULL,       -- additional backup options&lt;br&gt;
   @backupfldr    varchar(200) = NULL,       -- folder to write backup to &lt;br&gt;
   @reportfldr    varchar(200) = NULL,       -- folder to write text report &lt;br&gt;
   @verify        bit = 1,                   -- verify backup&lt;br&gt;
   @verifywith    varchar(500) = NULL,       -- additional verify options&lt;br&gt;
   @dbretainunit  varchar(10)  = NULL,       -- minutes | hours | days | weeks | months | copies&lt;br&gt;
   @dbretainval   int = 1,                   -- specifies how many retainunits to keep backup&lt;br&gt;
   @report        bit = 1,                   -- flag to indicate whether to generate report&lt;br&gt;
   @rptretainunit varchar(10)  = NULL,       -- minutes | hours | days | weeks | months | copies&lt;br&gt;
   @rptretainval  int = 1,                   -- specifies how many retainunits to keep reports&lt;br&gt;
   @checkattrib   bit = 0,                   -- check if archive bit is cleared before deleting&lt;br&gt;
   @delfirst      bit = 0,                   -- delete before backup (handy if space issues)&lt;br&gt;
   @debug         bit = 0                    -- print commands to be executed&lt;br&gt;
)&lt;br&gt;
AS&lt;br&gt;
/* &lt;br&gt;
   expressmaint&lt;br&gt;
   &lt;br&gt;
   see http://www.sqldbatips.com/showarticle.asp?ID=27 for documentation&lt;br&gt;
   &lt;br&gt;
   Date           Author                  Notes&lt;br&gt;
   24/07/2004     Jasper Smith            Initial release&lt;br&gt;
&lt;br&gt;
*/&lt;br&gt;
SET NOCOUNT ON&lt;br&gt;
SET DATEFORMAT YMD&lt;br&gt;
&lt;br&gt;
/************************&lt;br&gt;
   VARIABLE DECLARATION&lt;br&gt;
************************/&lt;br&gt;
&lt;br&gt;
   DECLARE @fso             int &lt;br&gt;
   DECLARE @file            int &lt;br&gt;
   DECLARE @reportfilename  varchar(500) &lt;br&gt;
   DECLARE @backupfilename  varchar(500) &lt;br&gt;
   DECLARE @delfilename     varchar(500)&lt;br&gt;
   DECLARE @cmd             varchar(650)&lt;br&gt;
   DECLARE @backupfldrorig  varchar(200)&lt;br&gt;
   DECLARE @databaseorig    sysname&lt;br&gt;
   DECLARE @table           nvarchar(600)&lt;br&gt;
   DECLARE @exists          varchar(5)&lt;br&gt;
   DECLARE @err             int&lt;br&gt;
   DECLARE @start           datetime&lt;br&gt;
   DECLARE @finish          datetime&lt;br&gt;
   DECLARE @runtime         datetime&lt;br&gt;
   DECLARE @output          varchar(200)&lt;br&gt;
   DECLARE @errormsg        varchar(210)&lt;br&gt;
   DECLARE @datepart        nchar(2)&lt;br&gt;
   DECLARE @execmd          nvarchar(1000)&lt;br&gt;
   DECLARE @delcmd          nvarchar(1000)&lt;br&gt;
   DECLARE @exemsg          varchar(8000)&lt;br&gt;
   DECLARE @filecount       int              ; SET @filecount    = 0&lt;br&gt;
   DECLARE @delcount        int              ; SET @delcount     = 0&lt;br&gt;
   DECLARE @hr              int              ; SET @hr           = 0&lt;br&gt;
   DECLARE @ret             int              ; SET @ret          = 0&lt;br&gt;
   DECLARE @cmdret          int              ; SET @cmdret       = 0&lt;br&gt;
   DECLARE @delbkflag       int              ; SET @delbkflag    = 0&lt;br&gt;
   DECLARE @delrptflag      int              ; SET @delrptflag   = 0&lt;br&gt;
   DECLARE @filecrt         int              ; SET @filecrt      = 0&lt;br&gt;
   DECLARE @user            sysname          ; SET @user         = SUSER_SNAME()&lt;br&gt;
   DECLARE @jobdt           datetime         ; SET @jobdt        = GETDATE()&lt;br&gt;
   DECLARE @jobstart        char(12)         ; &lt;br&gt;
   DECLARE @stage           int              ; SET @stage        = 1&lt;br&gt;
&lt;br&gt;
   SET @jobstart = CONVERT(char(8),@jobdt,112)+LEFT(REPLACE(CONVERT(char(8),@jobdt,108),':',''),4)   &lt;br&gt;
   IF RIGHT(@reportfldr,1)&lt;&gt;'\' SET @reportfldr = @reportfldr + '\'&lt;br&gt;
   IF RIGHT(@backupfldr,1)&lt;&gt;'\' SET @backupfldr = @backupfldr + '\'&lt;br&gt;
   SET @backupfldrorig = @backupfldr&lt;br&gt;
   SET @databaseorig = @database&lt;br&gt;
&lt;br&gt;
   CREATE TABLE #files(filename varchar(255))  &lt;br&gt;
   CREATE TABLE #exists(exist int,isdir int,parent int)&lt;br&gt;
   CREATE TABLE #databases(dbname sysname)&lt;br&gt;
&lt;br&gt;
/**********************************&lt;br&gt;
     INITIALIZE FSO IF @report = 1&lt;br&gt;
***********************************/&lt;br&gt;
&lt;br&gt;
   IF @report = 1&lt;br&gt;
   BEGIN&lt;br&gt;
      EXEC @hr=sp_OACreate 'Scripting.FileSystemObject',@fso OUT &lt;br&gt;
      IF @hr &lt;&gt; 0 &lt;br&gt;
      BEGIN   &lt;br&gt;
         EXEC sp_OAGetErrorInfo @fso&lt;br&gt;
         RAISERROR('Error creating File System Object',16,1)&lt;br&gt;
         SET @ret = 1&lt;br&gt;
      GOTO CLEANUP&lt;br&gt;
      END&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
/************************&lt;br&gt;
       CHECK INPUT&lt;br&gt;
************************/&lt;br&gt;
&lt;br&gt;
   -- check SQL2005 or higher&lt;br&gt;
   IF (select SUBSTRING(@@version,(CHARINDEX('-',@@version)+2),1))&lt;9&lt;br&gt;
BEGIN                   &lt;br&gt;
   RAISERROR('SQL2005 or higher is required for sp_expressmaint',16,1)&lt;br&gt;
      SET @ret = 1&lt;br&gt;
   GOTO CLEANUP&lt;br&gt;
END&lt;br&gt;
   &lt;br&gt;
   -- check sysadmin&lt;br&gt;
   IF IS_SRVROLEMEMBER('sysadmin') = 0&lt;br&gt;
BEGIN                   &lt;br&gt;
   RAISERROR('The current user %s is not a member of the sysadmin role',16,1,@user)&lt;br&gt;
      SET @ret = 1&lt;br&gt;
   GOTO CLEANUP&lt;br&gt;
END&lt;br&gt;
&lt;br&gt;
   -- check database exists and is online&lt;br&gt;
   IF @database NOT IN ('ALL_USER','ALL_SYSTEM')&lt;br&gt;
   BEGIN&lt;br&gt;
      IF (DB_ID(@database) IS NULL) OR ((select state from sys.databases where name = @database) &lt;&gt;0)&lt;br&gt;
   BEGIN                   &lt;br&gt;
      RAISERROR('Database %s is invalid or database status is not ONLINE',16,1,@database)&lt;br&gt;
         SET @ret = 1&lt;br&gt;
      GOTO CLEANUP&lt;br&gt;
   END&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   -- check @optype is valid&lt;br&gt;
   IF UPPER(@optype) NOT IN ('LOG','DB','DIFF','REINDEX','REORG','CHECKDB')&lt;br&gt;
BEGIN                   &lt;br&gt;
   RAISERROR('%s is not a valid option for @optype',16,1,@optype)&lt;br&gt;
      SET @ret = 1&lt;br&gt;
   GOTO CLEANUP&lt;br&gt;
END&lt;br&gt;
&lt;br&gt;
   -- check recovery mode is correct if trying log backup&lt;br&gt;
   IF @database NOT IN ('ALL_USER','ALL_SYSTEM')&lt;br&gt;
   BEGIN&lt;br&gt;
      IF (@optype = 'LOG' and ((select recovery_model from sys.databases where name = @database) = 3))&lt;br&gt;
   BEGIN                   &lt;br&gt;
      RAISERROR('%s is not a valid option for database %s because it is in SIMPLE recovery mode',16,1,@optype,@database)&lt;br&gt;
         SET @ret = 1&lt;br&gt;
      GOTO CLEANUP&lt;br&gt;
   END&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   -- no log backups for system databases&lt;br&gt;
   IF @database = 'ALL_SYSTEM'&lt;br&gt;
   BEGIN&lt;br&gt;
      IF @optype = 'LOG'&lt;br&gt;
   BEGIN                   &lt;br&gt;
      RAISERROR('%s is not a valid option for the option ALL_SYSTEM',16,1,@optype)&lt;br&gt;
         SET @ret = 1&lt;br&gt;
      GOTO CLEANUP&lt;br&gt;
   END&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   -- check that @backupfldr exists on the server&lt;br&gt;
   IF @optype NOT IN ('REINDEX','CHECKDB','REORG')&lt;br&gt;
   BEGIN&lt;br&gt;
      IF @report = 1&lt;br&gt;
      BEGIN&lt;br&gt;
         EXEC sp_OAMethod @fso,'FolderExists',@exists OUT,@backupfldr&lt;br&gt;
         IF @exists &lt;&gt; 'True'&lt;br&gt;
      BEGIN                   &lt;br&gt;
         RAISERROR('The folder %s does not exist on this server',16,1,@backupfldr)&lt;br&gt;
            SET @ret = 1&lt;br&gt;
         GOTO CLEANUP&lt;br&gt;
      END&lt;br&gt;
      END&lt;br&gt;
      ELSE&lt;br&gt;
      BEGIN&lt;br&gt;
         INSERT #exists&lt;br&gt;
         EXEC master.dbo.xp_fileexist @backupfldr&lt;br&gt;
         IF (SELECT MAX(isdir) FROM #exists)&lt;&gt;1&lt;br&gt;
      BEGIN                   &lt;br&gt;
         RAISERROR('The folder %s does not exist on this server',16,1,@backupfldr)&lt;br&gt;
            SET @ret = 1&lt;br&gt;
         GOTO CLEANUP&lt;br&gt;
      END&lt;br&gt;
      END&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   -- check that @reportfldr exists on the server&lt;br&gt;
   IF @reportfldr IS NOT NULL or @report = 1&lt;br&gt;
   BEGIN&lt;br&gt;
      IF @report = 1&lt;br&gt;
      BEGIN&lt;br&gt;
         EXEC sp_OAMethod @fso,'FolderExists',@exists OUT,@reportfldr&lt;br&gt;
         IF @exists &lt;&gt; 'True'&lt;br&gt;
      BEGIN                   &lt;br&gt;
         RAISERROR('The folder %s does not exist on this server',16,1,@reportfldr)&lt;br&gt;
            SET @ret = 1&lt;br&gt;
         GOTO CLEANUP&lt;br&gt;
      END&lt;br&gt;
      END&lt;br&gt;
      ELSE&lt;br&gt;
      BEGIN&lt;br&gt;
         DELETE #exists&lt;br&gt;
         INSERT #exists&lt;br&gt;
         EXEC master.dbo.xp_fileexist @reportfldr&lt;br&gt;
         IF (SELECT MAX(isdir) FROM #exists)&lt;&gt;1&lt;br&gt;
      BEGIN                   &lt;br&gt;
         RAISERROR('The folder %s does not exist on this server',16,1,@reportfldr)&lt;br&gt;
            SET @ret = 1&lt;br&gt;
         GOTO CLEANUP&lt;br&gt;
      END&lt;br&gt;
      END&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   -- check @dbretainunit is a vaild value&lt;br&gt;
   IF @optype NOT IN ('REINDEX','CHECKDB','REORG')&lt;br&gt;
   BEGIN&lt;br&gt;
      IF UPPER(@dbretainunit) NOT IN ('MINUTES','HOURS','DAYS','WEEKS','MONTHS','COPIES')&lt;br&gt;
    BEGIN                   &lt;br&gt;
      RAISERROR('%s is not a valid value for @dbretainunit (''minutes | hours | days | weeks | months | copies'')',16,1,@dbretainunit)&lt;br&gt;
         SET @ret = 1&lt;br&gt;
      GOTO CLEANUP&lt;br&gt;
   END&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   --check @dbretainval is a vaild value&lt;br&gt;
   IF @dbretainval&lt;1&lt;br&gt;
 BEGIN                   &lt;br&gt;
   RAISERROR('%i is not a valid value for @dbretainval (must be &gt;0)',16,1,@dbretainval)&lt;br&gt;
      SET @ret = 1&lt;br&gt;
   GOTO CLEANUP&lt;br&gt;
END&lt;br&gt;
&lt;br&gt;
   -- check @rptretainunit is a vaild value if present&lt;br&gt;
   IF UPPER(@rptretainunit) NOT IN ('MINUTES','HOURS','DAYS','WEEKS','MONTHS','COPIES') and @rptretainunit IS NOT NULL&lt;br&gt;
 BEGIN                   &lt;br&gt;
   RAISERROR('%s is not a valid value for @rptretainunit (''minutes | hours | days | weeks | months | copies'')',16,1,@rptretainunit)&lt;br&gt;
      SET @ret = 1&lt;br&gt;
   GOTO CLEANUP&lt;br&gt;
END&lt;br&gt;
&lt;br&gt;
   --check @rptretainval is a vaild value&lt;br&gt;
   IF @rptretainval&lt;1&lt;br&gt;
 BEGIN                   &lt;br&gt;
   RAISERROR('%i is not a valid value for @rptretainval (must be &gt;0)',16,1,@rptretainval)&lt;br&gt;
      SET @ret = 1&lt;br&gt;
   GOTO CLEANUP&lt;br&gt;
END&lt;br&gt;
&lt;br&gt;
/***********************************&lt;br&gt;
   list of databases to process&lt;br&gt;
************************************/&lt;br&gt;
&lt;br&gt;
   IF @database IN ('ALL_USER','ALL_SYSTEM')&lt;br&gt;
   BEGIN&lt;br&gt;
      IF @database = 'ALL_USER'&lt;br&gt;
         INSERT #databases(dbname) &lt;br&gt;
         SELECT [name] from sys.databases where database_id &gt; 4&lt;br&gt;
         AND (@optype &lt;&gt; 'LOG' OR recovery_model &lt;&gt; '3')&lt;br&gt;
      ELSE&lt;br&gt;
         INSERT #databases(dbname) &lt;br&gt;
         SELECT [name] from sys.databases where database_id in (1,3,4)&lt;br&gt;
   END&lt;br&gt;
   ELSE&lt;br&gt;
      INSERT #databases(dbname) SELECT @database&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
/***********************************&lt;br&gt;
   INITIALIZE REPORT IF @report = 1&lt;br&gt;
************************************/&lt;br&gt;
&lt;br&gt;
   -- generate report filename&lt;br&gt;
   SELECT @reportfilename = @reportfldr + REPLACE(@database,' ','_') +&lt;br&gt;
   CASE WHEN UPPER(@optype) = 'DB'   THEN '_FullDBBackup_report_'&lt;br&gt;
        WHEN UPPER(@optype) = 'DIFF' THEN '_DiffDBBackup_report_'&lt;br&gt;
        WHEN UPPER(@optype) = 'LOG'  THEN '_LogBackup_report_'   &lt;br&gt;
        WHEN UPPER(@optype) = 'REINDEX'  THEN '_Reindex_report_'    &lt;br&gt;
        WHEN UPPER(@optype) = 'REORG'  THEN '_Reorg_report_'   &lt;br&gt;
        WHEN UPPER(@optype) = 'CHECKDB'  THEN '_CheckDB_report_'      &lt;br&gt;
   END + @jobstart + '.txt'&lt;br&gt;
&lt;br&gt;
   -- if no report just set @reportfilename to NULL&lt;br&gt;
   IF @report = 0 SET @reportfilename = NULL&lt;br&gt;
&lt;br&gt;
   IF @debug = 1&lt;br&gt;
   BEGIN&lt;br&gt;
      PRINT '@reportfilename = ' + ISNULL(@reportfilename,'NULL')&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   IF @report = 1&lt;br&gt;
   BEGIN&lt;br&gt;
      -- create report file&lt;br&gt;
      EXEC @hr=sp_OAMethod @fso, 'CreateTextFile',@file OUT, @reportfilename&lt;br&gt;
      IF (@hr &lt;&gt; 0)&lt;br&gt;
      BEGIN&lt;br&gt;
         EXEC sp_OAGetErrorInfo @fso &lt;br&gt;
         RAISERROR('Error creating log file',16,1)&lt;br&gt;
         SET @ret = 1&lt;br&gt;
      GOTO CLEANUP&lt;br&gt;
      END&lt;br&gt;
      ELSE&lt;br&gt;
         -- set global flag to indicate we have created a report file&lt;br&gt;
         SET @filecrt = 1&lt;br&gt;
&lt;br&gt;
      -- write header   &lt;br&gt;
      EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
      SET @output = 'Expressmaint utility, Logged on to SQL Server [' + @@SERVERNAME + '] as ' + '[' + @user + ']'&lt;br&gt;
      IF @debug = 1 PRINT @output&lt;br&gt;
      EXEC sp_OAMethod @file,'WriteLine',NULL,@output       &lt;br&gt;
      &lt;br&gt;
&lt;br&gt;
      IF UPPER(@optype) NOT IN ('REINDEX','CHECKDB','REORG')&lt;br&gt;
      BEGIN&lt;br&gt;
         SET @output = 'Starting backup on ' + convert(varchar(25),getdate(),100)&lt;br&gt;
      END&lt;br&gt;
      IF UPPER(@optype) = 'CHECKDB'&lt;br&gt;
      BEGIN&lt;br&gt;
         SET @output = 'Starting CheckDB on ' + convert(varchar(25),getdate(),100)&lt;br&gt;
      END      &lt;br&gt;
      IF UPPER(@optype) IN ('REINDEX','REORG')&lt;br&gt;
      BEGIN&lt;br&gt;
         SET @output = 'Starting Reindex on ' + convert(varchar(25),getdate(),100)&lt;br&gt;
      END &lt;br&gt;
&lt;br&gt;
      IF @debug = 1 PRINT @output&lt;br&gt;
      EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
      EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
/************************&lt;br&gt;
     BACKUP ACTIONS&lt;br&gt;
************************/&lt;br&gt;
&lt;br&gt;
   IF  UPPER(@optype) = 'CHECKDB' GOTO CHECK_DB&lt;br&gt;
   IF  UPPER(@optype) IN ('REINDEX','REORG') GOTO REINDEX&lt;br&gt;
   &lt;br&gt;
   -- if @delfirst = 1  we need to delete prior backups that qualify&lt;br&gt;
   IF @delfirst = 1 GOTO DELFIRST&lt;br&gt;
&lt;br&gt;
   -- this label is so that we can return here after deleting files if @delfirst = 1&lt;br&gt;
   DOBACKUP:&lt;br&gt;
&lt;br&gt;
   DECLARE dcur CURSOR LOCAL FAST_FORWARD&lt;br&gt;
   FOR SELECT dbname FROM #databases ORDER BY dbname&lt;br&gt;
   OPEN dcur&lt;br&gt;
   FETCH NEXT FROM dcur into @database&lt;br&gt;
   WHILE @@FETCH_STATUS=0&lt;br&gt;
   BEGIN&lt;br&gt;
   &lt;br&gt;
      -- set backup start time&lt;br&gt;
      SET @start = GETDATE()&lt;br&gt;
   &lt;br&gt;
      -- write to text report&lt;br&gt;
      IF @report = 1&lt;br&gt;
      BEGIN&lt;br&gt;
         SET @output = '[' + CAST(@stage as varchar(10)) + '] Database ' + @database + ': ' +&lt;br&gt;
                       CASE WHEN UPPER(@optype) = 'DB'   THEN 'Full Backup '&lt;br&gt;
                            WHEN UPPER(@optype) = 'DIFF' THEN 'Differential Backup '&lt;br&gt;
                            WHEN UPPER(@optype) = 'LOG'  THEN 'Log Backup '         &lt;br&gt;
                       END + 'starting at ' + CONVERT(varchar(25),@start,100)&lt;br&gt;
         IF @debug = 1 PRINT @output&lt;br&gt;
         EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
      END&lt;br&gt;
&lt;br&gt;
      -- backup subfolder&lt;br&gt;
      SET @execmd = 'IF NOT EXIST "' + @backupfldrorig + @database + '\" MKDIR "' + @backupfldrorig + @database + '\"'&lt;br&gt;
      EXEC master.dbo.xp_cmdshell @execmd,no_output&lt;br&gt;
      SET @backupfldr = @backupfldrorig + @database + '\'&lt;br&gt;
&lt;br&gt;
      SELECT @backupfilename = @backupfldr + REPLACE(@database,' ','_') +&lt;br&gt;
      CASE WHEN UPPER(@optype) = 'DB'   THEN '_FullDBBackup_'&lt;br&gt;
           WHEN UPPER(@optype) = 'DIFF' THEN '_DiffDBBackup_'&lt;br&gt;
           WHEN UPPER(@optype) = 'LOG'  THEN '_LogBackup_'         &lt;br&gt;
      END + @jobstart + &lt;br&gt;
      CASE WHEN UPPER(@optype) = 'LOG' THEN '.TRN' ELSE '.BAK' END&lt;br&gt;
         &lt;br&gt;
      /************************&lt;br&gt;
             FULL BACKUP&lt;br&gt;
      ************************/&lt;br&gt;
   &lt;br&gt;
      IF UPPER(@optype) = 'DB'&lt;br&gt;
      BEGIN&lt;br&gt;
   &lt;br&gt;
         SET @execmd = N'BACKUP DATABASE [' + @database + '] TO DISK = ''' + @backupfilename + '''' +&lt;br&gt;
                       CASE WHEN @backupwith IS NULL THEN '' ELSE (' WITH ' + @backupwith) END&lt;br&gt;
   &lt;br&gt;
         BEGIN TRY&lt;br&gt;
   &lt;br&gt;
            EXEC(@execmd)&lt;br&gt;
   &lt;br&gt;
         END TRY&lt;br&gt;
         BEGIN CATCH -- backup failure&lt;br&gt;
            SELECT @err = @@ERROR,@ret = @err&lt;br&gt;
            SELECT @errormsg = 'Full backup of database ' + @database + ' failed with error : ' +  CAST(@err as varchar(10))&lt;br&gt;
            SET @output = SPACE(4) + '*** ' + @errormsg + ' ***'&lt;br&gt;
            IF @debug = 1 PRINT @output&lt;br&gt;
            IF @report = 1&lt;br&gt;
            BEGIN&lt;br&gt;
               EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
               SET @output = SPACE(4) + 'Refer to SQL Error Log and NT Event Log for further details'&lt;br&gt;
               EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
               EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
            END&lt;br&gt;
            CLOSE dcur&lt;br&gt;
            DEALLOCATE dcur&lt;br&gt;
            GOTO CLEANUP&lt;br&gt;
   &lt;br&gt;
         END CATCH &lt;br&gt;
         &lt;br&gt;
         -- backup success&lt;br&gt;
         SET @finish = GETDATE()&lt;br&gt;
         SET @output = SPACE(4) + 'Database backed up to ' + @backupfilename&lt;br&gt;
         IF @debug = 1 PRINT @output&lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
         END&lt;br&gt;
   &lt;br&gt;
         --calculate backup runtime&lt;br&gt;
         SET @runtime = (@finish - @start)&lt;br&gt;
         SET @output = SPACE(4) + 'Full database backup completed in '&lt;br&gt;
                     + CAST(DATEPART(hh,@runtime) as varchar(2)) + ' hour(s) '&lt;br&gt;
                     + CAST(DATEPART(mi,@runtime) as varchar(2)) + ' min(s) '&lt;br&gt;
                     + CAST(DATEPART(ss,@runtime) as varchar(2)) + ' second(s)'&lt;br&gt;
         IF @debug = 1 PRINT @output&lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
         END&lt;br&gt;
   &lt;br&gt;
      END&lt;br&gt;
   &lt;br&gt;
   &lt;br&gt;
      /************************&lt;br&gt;
         DIFFERENTIAL BACKUP&lt;br&gt;
      ************************/&lt;br&gt;
   &lt;br&gt;
      IF UPPER(@optype) = 'DIFF'&lt;br&gt;
      BEGIN&lt;br&gt;
   &lt;br&gt;
         SET @execmd = N'BACKUP DATABASE [' + @database + '] TO DISK = ''' + &lt;br&gt;
                        @backupfilename + ''' WITH DIFFERENTIAL' +&lt;br&gt;
                       CASE WHEN @backupwith IS NULL THEN '' ELSE (' , ' + @backupwith) END&lt;br&gt;
   &lt;br&gt;
         BEGIN TRY&lt;br&gt;
   &lt;br&gt;
            EXEC(@execmd)&lt;br&gt;
   &lt;br&gt;
         END TRY&lt;br&gt;
         BEGIN CATCH -- backup failure&lt;br&gt;
   &lt;br&gt;
            SELECT @err = @@ERROR,@ret = @err&lt;br&gt;
            SELECT @errormsg = 'Differential backup of database ' + @database + ' failed with error : ' +  CAST(@err as varchar(10))&lt;br&gt;
            SET @output = SPACE(4) + '*** ' + @errormsg + ' ***'&lt;br&gt;
            IF @debug = 1 PRINT @output&lt;br&gt;
            IF @report = 1&lt;br&gt;
            BEGIN&lt;br&gt;
               EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
               SET @output = SPACE(4) + 'Refer to SQL Error Log and NT Event Log for further details'&lt;br&gt;
               EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
            END&lt;br&gt;
            CLOSE dcur&lt;br&gt;
            DEALLOCATE dcur&lt;br&gt;
            GOTO CLEANUP&lt;br&gt;
   &lt;br&gt;
         END CATCH &lt;br&gt;
         &lt;br&gt;
         -- backup success&lt;br&gt;
         SET @finish = GETDATE()&lt;br&gt;
         SET @output = SPACE(4) + 'Database backed up to ' + @backupfilename&lt;br&gt;
         IF @debug = 1 PRINT @output&lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
         END&lt;br&gt;
   &lt;br&gt;
         --calculate backup runtime&lt;br&gt;
         SET @runtime = (@finish - @start)&lt;br&gt;
         SET @output = SPACE(4) + 'Differential database backup completed in '&lt;br&gt;
                     + CAST(DATEPART(hh,@runtime) as varchar(2)) + ' hour(s) '&lt;br&gt;
                     + CAST(DATEPART(mi,@runtime) as varchar(2)) + ' min(s) '&lt;br&gt;
                     + CAST(DATEPART(ss,@runtime) as varchar(2)) + ' second(s)'&lt;br&gt;
         IF @debug = 1 PRINT @output&lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
         END&lt;br&gt;
   &lt;br&gt;
      END&lt;br&gt;
   &lt;br&gt;
      /************************&lt;br&gt;
             LOG BACKUP&lt;br&gt;
      ************************/&lt;br&gt;
      &lt;br&gt;
      IF UPPER(@optype) = 'LOG'&lt;br&gt;
      BEGIN&lt;br&gt;
   &lt;br&gt;
         SET @execmd = N'BACKUP LOG [' + @database + '] TO DISK = ''' + @backupfilename + '''' +&lt;br&gt;
                       CASE WHEN @backupwith IS NULL THEN '' ELSE (' WITH ' + @backupwith) END&lt;br&gt;
   &lt;br&gt;
         BEGIN TRY&lt;br&gt;
   &lt;br&gt;
            EXEC(@execmd)&lt;br&gt;
   &lt;br&gt;
         END TRY&lt;br&gt;
         BEGIN CATCH -- backup failure&lt;br&gt;
   &lt;br&gt;
            SELECT @err = @@ERROR,@ret = @err&lt;br&gt;
            SELECT @errormsg = 'Log backup of database ' + @database + ' failed with error : ' +  CAST(@err as varchar(10))        &lt;br&gt;
            SET @output = SPACE(4) + '*** ' + @errormsg + ' ***'&lt;br&gt;
            IF @debug = 1 PRINT @output&lt;br&gt;
            IF @report = 1&lt;br&gt;
            BEGIN&lt;br&gt;
               EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
               SET @output = SPACE(4) + 'Refer to SQL Error Log and NT Event Log for further details'&lt;br&gt;
               EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
            END&lt;br&gt;
            CLOSE dcur&lt;br&gt;
            DEALLOCATE dcur&lt;br&gt;
            GOTO CLEANUP&lt;br&gt;
   &lt;br&gt;
         END CATCH &lt;br&gt;
         &lt;br&gt;
         -- backup success&lt;br&gt;
         SET @finish = GETDATE()&lt;br&gt;
         SET @output = SPACE(4) + 'Log backed up to ' + @backupfilename&lt;br&gt;
         IF @debug = 1 PRINT @output&lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
         END&lt;br&gt;
   &lt;br&gt;
         --calculate backup runtime&lt;br&gt;
         SET @runtime = (@finish - @start)&lt;br&gt;
         SET @output = SPACE(4) + 'Log backup completed in '&lt;br&gt;
                     + CAST(DATEPART(hh,@runtime) as varchar(2)) + ' hour(s) '&lt;br&gt;
                     + CAST(DATEPART(mi,@runtime) as varchar(2)) + ' min(s) '&lt;br&gt;
                     + CAST(DATEPART(ss,@runtime) as varchar(2)) + ' second(s)'&lt;br&gt;
         IF @debug = 1 PRINT @output&lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
         END&lt;br&gt;
   &lt;br&gt;
      END&lt;br&gt;
&lt;br&gt;
      SET @stage = (@stage + 1)&lt;br&gt;
&lt;br&gt;
      FETCH NEXT FROM dcur into @database&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   CLOSE dcur&lt;br&gt;
   DEALLOCATE dcur&lt;br&gt;
     &lt;br&gt;
   /************************&lt;br&gt;
         VERIFY BACKUP&lt;br&gt;
   ************************/&lt;br&gt;
&lt;br&gt;
   IF @verify = 1&lt;br&gt;
   BEGIN&lt;br&gt;
&lt;br&gt;
      DECLARE dcur CURSOR LOCAL FAST_FORWARD&lt;br&gt;
      FOR SELECT dbname FROM #databases ORDER BY dbname&lt;br&gt;
      OPEN dcur&lt;br&gt;
      FETCH NEXT FROM dcur into @database&lt;br&gt;
      WHILE @@FETCH_STATUS=0&lt;br&gt;
      BEGIN&lt;br&gt;
   &lt;br&gt;
         SELECT @backupfilename = @backupfldrorig + @database + '\' + REPLACE(@database,' ','_') +&lt;br&gt;
         CASE WHEN UPPER(@optype) = 'DB'   THEN '_FullDBBackup_'&lt;br&gt;
              WHEN UPPER(@optype) = 'DIFF' THEN '_DiffDBBackup_'&lt;br&gt;
              WHEN UPPER(@optype) = 'LOG'  THEN '_LogBackup_'         &lt;br&gt;
         END + @jobstart + &lt;br&gt;
         CASE WHEN UPPER(@optype) = 'LOG' THEN '.TRN' ELSE '.BAK' END&lt;br&gt;
      &lt;br&gt;
         SET @start = GETDATE()&lt;br&gt;
   &lt;br&gt;
         -- write to text report&lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
            SET @output = '[' + CAST(@stage as varchar(10)) + '] Database ' + @database + ': Verify Backup File...'&lt;br&gt;
            IF @debug = 1 PRINT @output&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output  &lt;br&gt;
         END&lt;br&gt;
         &lt;br&gt;
         SET @execmd = N'RESTORE VERIFYONLY FROM DISK = ''' + @backupfilename + '''' +&lt;br&gt;
                       CASE WHEN @verifywith IS NULL THEN '' ELSE (' WITH ' + @verifywith) END&lt;br&gt;
         &lt;br&gt;
         BEGIN TRY&lt;br&gt;
   &lt;br&gt;
            EXEC(@execmd)&lt;br&gt;
   &lt;br&gt;
         END TRY&lt;br&gt;
         BEGIN CATCH&lt;br&gt;
   &lt;br&gt;
            SELECT @err = @@ERROR,@ret = @err&lt;br&gt;
            SET @errormsg = 'Verify of ' + @backupfilename + ' failed with Native Error : ' + CAST(@err as varchar(10))&lt;br&gt;
            SET @output = SPACE(4) + '*** ' + @errormsg + ' ***'&lt;br&gt;
            IF @debug = 1 PRINT @output&lt;br&gt;
            IF @report = 1&lt;br&gt;
            BEGIN&lt;br&gt;
               EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
            END&lt;br&gt;
            CLOSE dcur&lt;br&gt;
            DEALLOCATE dcur&lt;br&gt;
            GOTO CLEANUP&lt;br&gt;
   &lt;br&gt;
         END CATCH&lt;br&gt;
   &lt;br&gt;
         -- verify success&lt;br&gt;
         SET @finish = GETDATE()&lt;br&gt;
         SET @output = SPACE(4) + 'Backup file ' + @backupfilename + ' verified'&lt;br&gt;
         IF @debug = 1 PRINT @output&lt;br&gt;
   &lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
         END&lt;br&gt;
   &lt;br&gt;
         --calculate verify runtime&lt;br&gt;
         SET @runtime = (@finish - @start)&lt;br&gt;
         SET @output = SPACE(4) + 'Verify backup completed in '&lt;br&gt;
                     + CAST(DATEPART(hh,@runtime) as varchar(2)) + ' hour(s) '&lt;br&gt;
                     + CAST(DATEPART(mi,@runtime) as varchar(2)) + ' min(s) '&lt;br&gt;
                     + CAST(DATEPART(ss,@runtime) as varchar(2)) + ' second(s)'&lt;br&gt;
         IF @debug = 1 PRINT @output&lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
         END&lt;br&gt;
&lt;br&gt;
         SET @stage = (@stage + 1)&lt;br&gt;
         FETCH NEXT FROM dcur into @database &lt;br&gt;
      END     &lt;br&gt;
&lt;br&gt;
      CLOSE dcur&lt;br&gt;
      DEALLOCATE dcur&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
/************************&lt;br&gt;
    DELETE OLD FILES&lt;br&gt;
************************/&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
   -- we have already deleted files so skip to the end&lt;br&gt;
   IF @delfirst = 1 GOTO CLEANUP&lt;br&gt;
&lt;br&gt;
   -- this label is so that we can delete files prior to backup if @delfirst = 1&lt;br&gt;
   DELFIRST:&lt;br&gt;
&lt;br&gt;
   /************************&lt;br&gt;
      DELETE OLD BACKUPS&lt;br&gt;
   ************************/&lt;br&gt;
&lt;br&gt;
   SET @datepart = CASE &lt;br&gt;
      WHEN UPPER(@dbretainunit) = 'MINUTES' THEN N'mi'&lt;br&gt;
      WHEN UPPER(@dbretainunit) = 'HOURS'   THEN N'hh'&lt;br&gt;
      WHEN UPPER(@dbretainunit) = 'DAYS'    THEN N'dd'&lt;br&gt;
      WHEN UPPER(@dbretainunit) = 'WEEKS'   THEN N'ww'&lt;br&gt;
      WHEN UPPER(@dbretainunit) = 'MONTHS'  THEN N'yy'&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   IF @debug = 1 PRINT '@datepart for backups = ' + @datepart&lt;br&gt;
&lt;br&gt;
   -- write to text report&lt;br&gt;
   IF @report = 1&lt;br&gt;
   BEGIN&lt;br&gt;
      EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
   END&lt;br&gt;
   SET @output = '[' + CAST(@stage as varchar(10)) + '] Delete Old Backup Files...'&lt;br&gt;
   IF @debug = 1 PRINT @output&lt;br&gt;
   IF @report = 1&lt;br&gt;
   BEGIN&lt;br&gt;
      EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   DECLARE dcur CURSOR LOCAL FAST_FORWARD&lt;br&gt;
   FOR SELECT dbname FROM #databases ORDER BY dbname&lt;br&gt;
   OPEN dcur&lt;br&gt;
   FETCH NEXT FROM dcur into @database&lt;br&gt;
   WHILE @@FETCH_STATUS=0&lt;br&gt;
   BEGIN&lt;br&gt;
&lt;br&gt;
      SET @backupfldr = + @backupfldrorig + @database + '\'&lt;br&gt;
      SELECT @backupfilename = @backupfldr + REPLACE(@database,' ','_') +&lt;br&gt;
      CASE WHEN UPPER(@optype) = 'DB'   THEN '_FullDBBackup_'&lt;br&gt;
           WHEN UPPER(@optype) = 'DIFF' THEN '_DiffDBBackup_'&lt;br&gt;
           WHEN UPPER(@optype) = 'LOG'  THEN '_LogBackup_'         &lt;br&gt;
      END + @jobstart + &lt;br&gt;
      CASE WHEN UPPER(@optype) = 'LOG' THEN '.TRN' ELSE '.BAK' END&lt;br&gt;
   &lt;br&gt;
      -- load files in @backupfldr&lt;br&gt;
      IF @checkattrib = 1&lt;br&gt;
         SET @cmd = 'dir /B /A-D-A /OD "' + @backupfldr + REPLACE(@database,' ','_') +&lt;br&gt;
         CASE WHEN UPPER(@optype) = 'DB' THEN '_FullDBBackup_'&lt;br&gt;
              WHEN UPPER(@optype) = 'DIFF' THEN '_DiffDBBackup_'&lt;br&gt;
              WHEN UPPER(@optype) = 'LOG'  THEN '_LogBackup_' END + '*' +&lt;br&gt;
         CASE WHEN UPPER(@optype) = 'LOG' THEN '.TRN' ELSE '.BAK' END + '"'&lt;br&gt;
      ELSE &lt;br&gt;
         SET @cmd = 'dir /B /A-D /OD "' + @backupfldr + REPLACE(@database,' ','_') +&lt;br&gt;
         CASE WHEN UPPER(@optype) = 'DB' THEN '_FullDBBackup_'&lt;br&gt;
              WHEN UPPER(@optype) = 'DIFF' THEN '_DiffDBBackup_'&lt;br&gt;
              WHEN UPPER(@optype) = 'LOG'  THEN '_LogBackup_' END + '*' +&lt;br&gt;
         CASE WHEN UPPER(@optype) = 'LOG' THEN '.TRN' ELSE '.BAK' END + '"'&lt;br&gt;
   &lt;br&gt;
      IF @debug = 1 PRINT '@cmd = ' + @cmd&lt;br&gt;
&lt;br&gt;
      DELETE #files&lt;br&gt;
      INSERT #files EXEC master.dbo.xp_cmdshell @cmd&lt;br&gt;
      DELETE #files WHERE filename IS NULL or filename = ISNULL(REPLACE(@backupfilename,@backupfldr,''),'nothing')&lt;br&gt;
   &lt;br&gt;
      IF @debug = 1 SELECT * FROM #files&lt;br&gt;
      &lt;br&gt;
      -- get count of files that match pattern&lt;br&gt;
      SELECT @filecount = COUNT(*) from #files &lt;br&gt;
      WHERE PATINDEX('%File Not Found%',filename) = 0&lt;br&gt;
      AND PATINDEX('%The system cannot find%',filename) = 0 &lt;br&gt;
   &lt;br&gt;
      -- remove files that don't meet retention criteria if there are any files that match pattern&lt;br&gt;
      IF UPPER(@dbretainunit) &lt;&gt; 'COPIES'&lt;br&gt;
      BEGIN&lt;br&gt;
         IF @filecount&gt;0&lt;br&gt;
         BEGIN&lt;br&gt;
            SET @delcmd = N'DELETE #files WHERE DATEADD(' + @datepart + N',' + CAST(@dbretainval as nvarchar(10)) + N',' +&lt;br&gt;
                    'CONVERT(datetime,(SUBSTRING(SUBSTRING(filename,((LEN(filename)-CHARINDEX(''_'',REVERSE(filename)))+2),12),7,2) +''/''&lt;br&gt;
                    + SUBSTRING(SUBSTRING(filename,((LEN(filename)-CHARINDEX(''_'',REVERSE(filename)))+2),12),5,2) +''/''&lt;br&gt;
                    + SUBSTRING(SUBSTRING(filename,((LEN(filename)-CHARINDEX(''_'',REVERSE(filename)))+2),12),1,4) +'' ''&lt;br&gt;
                    + SUBSTRING(SUBSTRING(filename,((LEN(filename)-CHARINDEX(''_'',REVERSE(filename)))+2),12),9,2) +'':''&lt;br&gt;
                    + SUBSTRING(SUBSTRING(filename,((LEN(filename)-CHARINDEX(''_'',REVERSE(filename)))+2),12),11,2)),103)) &gt; ''' + CAST(@jobdt as nvarchar(25)) + N''''&lt;br&gt;
            &lt;br&gt;
            IF @debug = 1 PRINT '@delcmd=' + @delcmd&lt;br&gt;
            EXEC master.dbo.sp_executesql @delcmd&lt;br&gt;
      &lt;br&gt;
            SELECT @delcount = COUNT(*) from #files&lt;br&gt;
         END&lt;br&gt;
         ELSE&lt;br&gt;
         BEGIN&lt;br&gt;
            SELECT @delcount = 0&lt;br&gt;
         END&lt;br&gt;
      END&lt;br&gt;
      ELSE  -- number of copies not date based (include current backup that's not in #files)&lt;br&gt;
      BEGIN&lt;br&gt;
         IF @filecount&gt;0&lt;br&gt;
         BEGIN&lt;br&gt;
            IF @dbretainval&gt;1 &lt;br&gt;
            BEGIN&lt;br&gt;
               SET @delcmd = N'DELETE #files WHERE filename IN(SELECT TOP ' + CAST((@dbretainval-1) as nvarchar(10)) +&lt;br&gt;
                             N' filename FROM #files ORDER BY substring(filename,((len(filename)+2)-charindex(''_'',reverse(filename))),12) DESC)'&lt;br&gt;
      &lt;br&gt;
               IF @debug = 1 PRINT '@delcmd=' + @delcmd&lt;br&gt;
               EXEC master.dbo.sp_executesql @delcmd&lt;br&gt;
            END&lt;br&gt;
      &lt;br&gt;
            SELECT @delcount = COUNT(*) from #files&lt;br&gt;
   &lt;br&gt;
         END&lt;br&gt;
         ELSE&lt;br&gt;
         BEGIN&lt;br&gt;
            SELECT @delcount = 0&lt;br&gt;
         END&lt;br&gt;
      END&lt;br&gt;
   &lt;br&gt;
      IF @debug = 1 PRINT '@delcount = ' + STR(@delcount)&lt;br&gt;
   &lt;br&gt;
      -- if there are any matching files&lt;br&gt;
      IF @filecount&gt;0&lt;br&gt;
      BEGIN&lt;br&gt;
         -- are there any files that need deleting&lt;br&gt;
         IF @delcount&gt;0&lt;br&gt;
         BEGIN&lt;br&gt;
            DECLARE FCUR CURSOR FORWARD_ONLY FOR&lt;br&gt;
            SELECT * FROM #files&lt;br&gt;
            OPEN FCUR&lt;br&gt;
            FETCH NEXT FROM FCUR INTO @delfilename&lt;br&gt;
            WHILE @@FETCH_STATUS=0&lt;br&gt;
            BEGIN&lt;br&gt;
               SET @cmd = 'DEL /Q "' + @backupfldr + @delfilename + '"'&lt;br&gt;
               EXEC @cmdret = master.dbo.xp_cmdshell @cmd,no_output   &lt;br&gt;
   &lt;br&gt;
               -- log failure to delete but don't abort procedure&lt;br&gt;
               IF @cmdret&lt;&gt;0&lt;br&gt;
               BEGIN&lt;br&gt;
                  SET @output = SPACE(4) + '*** Error: Failed to delete file ' + @backupfldr + @delfilename + ' ***'&lt;br&gt;
                  IF @debug = 1 PRINT @output&lt;br&gt;
                  IF @report = 1&lt;br&gt;
                  BEGIN&lt;br&gt;
                     EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
                  END&lt;br&gt;
                  SELECT @delbkflag = 1 , @cmdret = 0, @delcount = (@delcount-1)&lt;br&gt;
               END&lt;br&gt;
               ELSE&lt;br&gt;
               BEGIN&lt;br&gt;
                  SET @output = SPACE(4) + 'Deleted file ' + @backupfldr + @delfilename&lt;br&gt;
                  IF @debug = 1 PRINT @output&lt;br&gt;
                  IF @report = 1&lt;br&gt;
                  BEGIN&lt;br&gt;
                     EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
                  END&lt;br&gt;
               END&lt;br&gt;
   &lt;br&gt;
               FETCH NEXT FROM FCUR INTO @delfilename&lt;br&gt;
            END&lt;br&gt;
            CLOSE FCUR&lt;br&gt;
            DEALLOCATE FCUR&lt;br&gt;
         END&lt;br&gt;
      END&lt;br&gt;
   &lt;br&gt;
      -- write to text report&lt;br&gt;
      SET @output = SPACE(4) + CAST(@delcount as varchar(10)) + ' file(s) deleted.'&lt;br&gt;
      IF @debug = 1 PRINT @output&lt;br&gt;
      IF @report = 1&lt;br&gt;
      BEGIN&lt;br&gt;
         EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
         EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
      END&lt;br&gt;
&lt;br&gt;
      FETCH NEXT FROM dcur into @database&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   CLOSE dcur&lt;br&gt;
   DEALLOCATE dcur&lt;br&gt;
&lt;br&gt;
   -- clear temporary table and variables&lt;br&gt;
   DELETE #files&lt;br&gt;
   SET @cmd = ''&lt;br&gt;
   SET @delcmd = ''&lt;br&gt;
   SET @delfilename = ''&lt;br&gt;
   SET @datepart = ''&lt;br&gt;
   SET @filecount = 0&lt;br&gt;
   SET @delcount = 0&lt;br&gt;
   SET @cmdret = 0&lt;br&gt;
   SET @stage = @stage + 1&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
   /************************&lt;br&gt;
      DELETE OLD REPORTS&lt;br&gt;
   ************************/&lt;br&gt;
&lt;br&gt;
   DELREPORTS:&lt;br&gt;
&lt;br&gt;
   IF @rptretainunit IS NOT NULL&lt;br&gt;
   BEGIN&lt;br&gt;
      SET @datepart = CASE &lt;br&gt;
         WHEN UPPER(@rptretainunit) = 'MINUTES' THEN N'mi'&lt;br&gt;
         WHEN UPPER(@rptretainunit) = 'HOURS'   THEN N'hh'&lt;br&gt;
         WHEN UPPER(@rptretainunit) = 'DAYS'    THEN N'dd'&lt;br&gt;
         WHEN UPPER(@rptretainunit) = 'WEEKS'   THEN N'ww'&lt;br&gt;
         WHEN UPPER(@rptretainunit) = 'MONTHS'  THEN N'yy'&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   IF @debug = 1 PRINT '@datepart for reports = ' + @datepart&lt;br&gt;
&lt;br&gt;
   -- write to text report&lt;br&gt;
   SET @output = '[' + CAST(@stage as varchar(10)) + '] Delete Old Report Files...'&lt;br&gt;
   IF @debug = 1 PRINT @output&lt;br&gt;
   IF @report = 1&lt;br&gt;
   BEGIN&lt;br&gt;
      EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   -- load files in @reportfldr&lt;br&gt;
   SET @cmd = 'dir /B /A-D /OD "' + @reportfldr + REPLACE(@databaseorig,' ','_') +&lt;br&gt;
   CASE WHEN UPPER(@optype) = 'DB' THEN '_FullDBBackup_report_'&lt;br&gt;
        WHEN UPPER(@optype) = 'DIFF' THEN '_DiffDBBackup_report_'&lt;br&gt;
        WHEN UPPER(@optype) = 'REINDEX'  THEN '_Reindex_report_'     &lt;br&gt;
        WHEN UPPER(@optype) = 'CHECKDB'  THEN '_CheckDB_report_'     &lt;br&gt;
        WHEN UPPER(@optype) = 'REORG'  THEN '_Reorg_report_' &lt;br&gt;
        WHEN UPPER(@optype) = 'LOG'  THEN '_LogBackup_report_' END + '*.txt"'&lt;br&gt;
&lt;br&gt;
   IF @debug = 1 PRINT '@cmd = ' + @cmd&lt;br&gt;
&lt;br&gt;
   INSERT #files EXEC master.dbo.xp_cmdshell @cmd&lt;br&gt;
   DELETE #files WHERE filename IS NULL&lt;br&gt;
&lt;br&gt;
   IF @debug = 1 SELECT * FROM #files&lt;br&gt;
   &lt;br&gt;
   -- get count of files that match pattern&lt;br&gt;
   SELECT @filecount = COUNT(*) from #files &lt;br&gt;
   WHERE PATINDEX('%File Not Found%',filename) = 0&lt;br&gt;
   AND PATINDEX('%The system cannot find%',filename) = 0 &lt;br&gt;
&lt;br&gt;
   -- remove files that don't meet retention criteria if there are any files that match pattern&lt;br&gt;
   IF UPPER(@rptretainunit) &lt;&gt; 'COPIES'&lt;br&gt;
   BEGIN&lt;br&gt;
      IF @filecount&gt;0&lt;br&gt;
      BEGIN&lt;br&gt;
         SET @delcmd = N'DELETE #files WHERE DATEADD(' + @datepart + N',' + CAST(@rptretainval as nvarchar(10)) + N',' +&lt;br&gt;
                 'CONVERT(datetime,(SUBSTRING(SUBSTRING(filename,((LEN(filename)-CHARINDEX(''_'',REVERSE(filename)))+2),12),7,2) +''/''&lt;br&gt;
                 + SUBSTRING(SUBSTRING(filename,((LEN(filename)-CHARINDEX(''_'',REVERSE(filename)))+2),12),5,2) +''/''&lt;br&gt;
                 + SUBSTRING(SUBSTRING(filename,((LEN(filename)-CHARINDEX(''_'',REVERSE(filename)))+2),12),1,4) +'' ''&lt;br&gt;
                 + SUBSTRING(SUBSTRING(filename,((LEN(filename)-CHARINDEX(''_'',REVERSE(filename)))+2),12),9,2) +'':''&lt;br&gt;
                 + SUBSTRING(SUBSTRING(filename,((LEN(filename)-CHARINDEX(''_'',REVERSE(filename)))+2),12),11,2)),103)) &gt; ''' + CAST(@jobdt as nvarchar(25)) + N''''&lt;br&gt;
         &lt;br&gt;
         IF @debug = 1 PRINT '@delcmd=' + @delcmd&lt;br&gt;
         EXEC master.dbo.sp_executesql @delcmd&lt;br&gt;
   &lt;br&gt;
         SELECT @delcount = COUNT(*) from #files&lt;br&gt;
      END&lt;br&gt;
      ELSE&lt;br&gt;
      BEGIN&lt;br&gt;
         SELECT @delcount = 0&lt;br&gt;
      END&lt;br&gt;
   END&lt;br&gt;
   ELSE  -- number of copies not date based&lt;br&gt;
   BEGIN&lt;br&gt;
      IF @filecount&gt;0&lt;br&gt;
      BEGIN&lt;br&gt;
         SET @delcmd = N'DELETE #files WHERE filename IN(SELECT TOP ' + CAST(@rptretainval as nvarchar(10)) +&lt;br&gt;
                       N' filename FROM #files ORDER BY substring(filename,((len(filename)+2)-charindex(''_'',reverse(filename))),12) DESC)'&lt;br&gt;
&lt;br&gt;
         IF @debug = 1 PRINT '@delcmd=' + @delcmd&lt;br&gt;
         EXEC master.dbo.sp_executesql @delcmd&lt;br&gt;
   &lt;br&gt;
         SELECT @delcount = COUNT(*) from #files&lt;br&gt;
      END&lt;br&gt;
      ELSE&lt;br&gt;
      BEGIN&lt;br&gt;
         SELECT @delcount = 0&lt;br&gt;
      END&lt;br&gt;
   END&lt;br&gt;
   &lt;br&gt;
   IF @debug = 1 PRINT STR(@delcount)&lt;br&gt;
&lt;br&gt;
   -- if there are any matching files&lt;br&gt;
   IF @filecount&gt;0&lt;br&gt;
   BEGIN&lt;br&gt;
      -- are there any files that need deleting&lt;br&gt;
      IF @delcount&gt;0&lt;br&gt;
      BEGIN&lt;br&gt;
         DECLARE FCUR CURSOR FORWARD_ONLY FOR&lt;br&gt;
         SELECT * FROM #files&lt;br&gt;
         OPEN FCUR&lt;br&gt;
         FETCH NEXT FROM FCUR INTO @delfilename&lt;br&gt;
         WHILE @@FETCH_STATUS=0&lt;br&gt;
         BEGIN&lt;br&gt;
            SET @cmd = 'DEL /Q "' + @reportfldr + @delfilename + '"'&lt;br&gt;
            EXEC @cmdret = master.dbo.xp_cmdshell @cmd,no_output   &lt;br&gt;
&lt;br&gt;
            -- log failure to delete but don't abort procedure&lt;br&gt;
            IF @cmdret&lt;&gt;0&lt;br&gt;
            BEGIN&lt;br&gt;
&lt;br&gt;
               SET @output = SPACE(4) + '*** Error: Failed to delete file ' + @reportfldr + @delfilename + ' ***'&lt;br&gt;
               IF @debug = 1 PRINT @output&lt;br&gt;
               IF @report = 1&lt;br&gt;
               BEGIN&lt;br&gt;
                  EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
               END&lt;br&gt;
               SELECT @delrptflag = 1 , @cmdret = 0, @delcount = (@delcount-1)&lt;br&gt;
            END&lt;br&gt;
            BEGIN&lt;br&gt;
               SET @output = SPACE(4) + 'Deleted file ' + @reportfldr + @delfilename&lt;br&gt;
               IF @debug = 1 PRINT @output&lt;br&gt;
               IF @report = 1&lt;br&gt;
               BEGIN&lt;br&gt;
                  EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
               END&lt;br&gt;
            END&lt;br&gt;
&lt;br&gt;
            FETCH NEXT FROM FCUR INTO @delfilename&lt;br&gt;
         END&lt;br&gt;
         CLOSE FCUR&lt;br&gt;
         DEALLOCATE FCUR&lt;br&gt;
      END&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   -- write to text report&lt;br&gt;
   SET @output = SPACE(4) + CAST(@delcount as varchar(10)) + ' file(s) deleted.'&lt;br&gt;
   IF @debug = 1 PRINT @output&lt;br&gt;
   IF @report = 1&lt;br&gt;
   BEGIN&lt;br&gt;
      EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
      EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   -- update stage&lt;br&gt;
   SET @stage = @stage + 1&lt;br&gt;
   END&lt;br&gt;
   -- if we got here due to @delfirst = 1 go back and do the backups&lt;br&gt;
   IF @delfirst = 1 &lt;br&gt;
      GOTO DOBACKUP&lt;br&gt;
   ELSE &lt;br&gt;
      GOTO CLEANUP&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
/************************&lt;br&gt;
         CHECKDB &lt;br&gt;
************************/&lt;br&gt;
&lt;br&gt;
   CHECK_DB:&lt;br&gt;
&lt;br&gt;
   IF @optype = 'CHECKDB'&lt;br&gt;
   BEGIN&lt;br&gt;
&lt;br&gt;
      DECLARE dcur CURSOR LOCAL FAST_FORWARD&lt;br&gt;
      FOR SELECT dbname FROM #databases ORDER BY dbname&lt;br&gt;
      OPEN dcur&lt;br&gt;
      FETCH NEXT FROM dcur into @database&lt;br&gt;
      WHILE @@FETCH_STATUS=0&lt;br&gt;
      BEGIN&lt;br&gt;
&lt;br&gt;
         -- write to text report&lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
            SET @output = '[' + CAST(@stage as varchar(10)) + '] Database ' + @database + ': Check Data and Index Linkage...'&lt;br&gt;
            IF @debug = 1 PRINT @output&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output  &lt;br&gt;
         END&lt;br&gt;
&lt;br&gt;
         -- set backup start time&lt;br&gt;
         SET @start = GETDATE()&lt;br&gt;
&lt;br&gt;
         SET @execmd = N'DBCC CHECKDB([' + @database + N']) WITH NO_INFOMSGS'&lt;br&gt;
         IF @debug = 1 PRINT 'DBCC Command : ' + @execmd&lt;br&gt;
         &lt;br&gt;
         BEGIN TRY&lt;br&gt;
&lt;br&gt;
            EXEC(@execmd)&lt;br&gt;
&lt;br&gt;
         END TRY&lt;br&gt;
         BEGIN CATCH&lt;br&gt;
&lt;br&gt;
            SELECT @err = @@ERROR,@ret = @err&lt;br&gt;
            SET @errormsg = 'CheckDB of ' + @database + ' failed with Native Error : ' + CAST(@err as varchar(10))&lt;br&gt;
            SET @output = SPACE(4) + '*** ' + @errormsg + ' ***'&lt;br&gt;
            PRINT @output&lt;br&gt;
            IF @report = 1&lt;br&gt;
            BEGIN&lt;br&gt;
               EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
            END&lt;br&gt;
            CLOSE dcur&lt;br&gt;
            DEALLOCATE dcur&lt;br&gt;
            GOTO CLEANUP&lt;br&gt;
&lt;br&gt;
         END CATCH&lt;br&gt;
         &lt;br&gt;
         SET @finish = GETDATE()&lt;br&gt;
&lt;br&gt;
         --calculate checkdb runtime&lt;br&gt;
         SET @runtime = (@finish - @start)&lt;br&gt;
         SET @output = SPACE(4) + 'CheckDB completed in '&lt;br&gt;
                     + CAST(DATEPART(hh,@runtime) as varchar(2)) + ' hour(s) '&lt;br&gt;
                     + CAST(DATEPART(mi,@runtime) as varchar(2)) + ' min(s) '&lt;br&gt;
                     + CAST(DATEPART(ss,@runtime) as varchar(2)) + ' second(s)'&lt;br&gt;
         IF @debug = 1 PRINT @output&lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
         END   &lt;br&gt;
         SET @stage = (@stage + 1)&lt;br&gt;
         FETCH NEXT FROM dcur into @database      &lt;br&gt;
      &lt;br&gt;
      END&lt;br&gt;
&lt;br&gt;
      CLOSE dcur&lt;br&gt;
      DEALLOCATE dcur&lt;br&gt;
      &lt;br&gt;
      -- delete reports&lt;br&gt;
      IF @report = 1&lt;br&gt;
      BEGIN&lt;br&gt;
         EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
      END&lt;br&gt;
      GOTO DELREPORTS&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
/************************&lt;br&gt;
     REINDEX/REORG&lt;br&gt;
************************/&lt;br&gt;
&lt;br&gt;
   REINDEX:&lt;br&gt;
&lt;br&gt;
   IF @optype in ('REINDEX','REORG')&lt;br&gt;
   BEGIN&lt;br&gt;
&lt;br&gt;
      DECLARE dcur CURSOR LOCAL FAST_FORWARD&lt;br&gt;
      FOR SELECT dbname FROM #databases ORDER BY dbname&lt;br&gt;
      OPEN dcur&lt;br&gt;
      FETCH NEXT FROM dcur into @database&lt;br&gt;
      WHILE @@FETCH_STATUS=0&lt;br&gt;
      BEGIN&lt;br&gt;
&lt;br&gt;
         -- write to text report&lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
            IF @optype = 'REINDEX'&lt;br&gt;
               SET @output = '[' + CAST(@stage as varchar(10)) + '] Database ' + @database + ': Index Rebuild (using original fillfactor)...'&lt;br&gt;
            ELSE&lt;br&gt;
               SET @output = '[' + CAST(@stage as varchar(10)) + '] Database ' + @database + ': Index Reorganize...'&lt;br&gt;
&lt;br&gt;
            IF @debug = 1 PRINT @output&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output  &lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,''  &lt;br&gt;
         END&lt;br&gt;
&lt;br&gt;
         -- set start time&lt;br&gt;
         SET @start = GETDATE()&lt;br&gt;
&lt;br&gt;
         -- all user tables&lt;br&gt;
         CREATE TABLE #tables(tablename sysname)&lt;br&gt;
         EXEC(N'INSERT #tables(tablename) SELECT DISTINCT(''['' + s.[name] + ''].['' + t.[name] + '']'') FROM [' + @database + N'].sys.tables t ' +&lt;br&gt;
              N'JOIN [' + @database + N'].sys.schemas s on t.schema_id=s.schema_id ' +&lt;br&gt;
              N'JOIN [' + @database + N'].sys.indexes i on t.object_id=i.object_id ' +&lt;br&gt;
              N'WHERE t.is_ms_shipped = 0 AND i.type&gt;0')&lt;br&gt;
&lt;br&gt;
         DECLARE tcur CURSOR LOCAL FAST_FORWARD &lt;br&gt;
         FOR SELECT tablename FROM #tables ORDER BY tablename&lt;br&gt;
         OPEN tcur&lt;br&gt;
         FETCH NEXT FROM tcur INTO @table&lt;br&gt;
         WHILE @@FETCH_STATUS = 0&lt;br&gt;
         BEGIN&lt;br&gt;
&lt;br&gt;
            IF @report = 1&lt;br&gt;
            BEGIN&lt;br&gt;
               IF @optype = 'REINDEX'&lt;br&gt;
                  SET @output = SPACE(4) + N'Rebuilding indexes for table ' + @table&lt;br&gt;
               ELSE&lt;br&gt;
                  SET @output = SPACE(4) + N'Reorganizing indexes for table ' + @table&lt;br&gt;
&lt;br&gt;
               EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
            END   &lt;br&gt;
&lt;br&gt;
            &lt;br&gt;
            IF @optype = 'REINDEX'&lt;br&gt;
               SET @execmd = N'ALTER INDEX ALL ON [' + @database + N'].' + @table + N' REBUILD'&lt;br&gt;
            ELSE&lt;br&gt;
               SET @execmd = N'ALTER INDEX ALL ON [' + @database + N'].' + @table + N' REORGANIZE'&lt;br&gt;
   &lt;br&gt;
            IF @debug = 1 PRINT 'Reindex Command : ' + @execmd&lt;br&gt;
&lt;br&gt;
            BEGIN TRY&lt;br&gt;
   &lt;br&gt;
               EXEC(@execmd)&lt;br&gt;
   &lt;br&gt;
            END TRY&lt;br&gt;
            BEGIN CATCH&lt;br&gt;
            &lt;br&gt;
               SELECT @err = @@ERROR,@ret = @err&lt;br&gt;
               SET @errormsg = 'Rebuild of indexes on [' + @database + N'].' + @table + ' failed with Native Error : ' + CAST(@err as varchar(10))&lt;br&gt;
               SET @output = SPACE(4) + '*** ' + @errormsg + ' ***'&lt;br&gt;
               PRINT @output&lt;br&gt;
               IF @report = 1&lt;br&gt;
               BEGIN&lt;br&gt;
                  EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
               END&lt;br&gt;
               CLOSE tcur&lt;br&gt;
               DEALLOCATE tcur&lt;br&gt;
               DROP TABLE #tables&lt;br&gt;
               GOTO CLEANUP&lt;br&gt;
   &lt;br&gt;
            END CATCH&lt;br&gt;
&lt;br&gt;
            FETCH NEXT FROM tcur INTO @table&lt;br&gt;
         END&lt;br&gt;
&lt;br&gt;
         CLOSE tcur&lt;br&gt;
         DEALLOCATE tcur&lt;br&gt;
    &lt;br&gt;
         SET @finish = GETDATE()&lt;br&gt;
&lt;br&gt;
         --calculate runtime&lt;br&gt;
         SET @runtime = (@finish - @start)&lt;br&gt;
         SET @output = SPACE(4) + 'Index maintenance completed in '&lt;br&gt;
                     + CAST(DATEPART(hh,@runtime) as varchar(2)) + ' hour(s) '&lt;br&gt;
                     + CAST(DATEPART(mi,@runtime) as varchar(2)) + ' min(s) '&lt;br&gt;
                     + CAST(DATEPART(ss,@runtime) as varchar(2)) + ' second(s)'&lt;br&gt;
         IF @debug = 1 PRINT @output&lt;br&gt;
         IF @report = 1&lt;br&gt;
         BEGIN&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
            EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
         END   &lt;br&gt;
&lt;br&gt;
         DROP TABLE #tables&lt;br&gt;
&lt;br&gt;
         SET @stage = (@stage + 1)&lt;br&gt;
         FETCH NEXT FROM dcur into @database   &lt;br&gt;
      &lt;br&gt;
      END&lt;br&gt;
&lt;br&gt;
      CLOSE dcur&lt;br&gt;
      DEALLOCATE dcur&lt;br&gt;
      &lt;br&gt;
      -- delete reports&lt;br&gt;
      GOTO DELREPORTS&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
      &lt;br&gt;
/************************&lt;br&gt;
         CLEAN UP &lt;br&gt;
************************/&lt;br&gt;
&lt;br&gt;
   CLEANUP:&lt;br&gt;
&lt;br&gt;
   DROP TABLE #files&lt;br&gt;
   DROP TABLE #exists&lt;br&gt;
   DROP TABLE #databases&lt;br&gt;
&lt;br&gt;
   -- if we encountered errors deleting old backups return failure&lt;br&gt;
   IF @delbkflag&lt;&gt;0&lt;br&gt;
   BEGIN&lt;br&gt;
      SET @errormsg = 'Expressmaint encountered errors deleting old backup files' + CHAR(13)&lt;br&gt;
                    + CASE WHEN @report = 1 THEN ('Please see ' + @reportfilename + CHAR(13) + ' for further details') ELSE '' END&lt;br&gt;
      RAISERROR(@errormsg,16,1)&lt;br&gt;
      SET @ret = 1&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   -- if we encountered errors deleting old reports return failure&lt;br&gt;
   IF (@delrptflag&lt;&gt;0 AND @delbkflag = 0)&lt;br&gt;
   BEGIN&lt;br&gt;
      SET @errormsg = 'Expressmaint encountered errors deleting old report files' + CHAR(13)&lt;br&gt;
                    + CASE WHEN @report = 1 THEN ('Please see ' + @reportfilename + CHAR(13) + ' for further details') ELSE '' END&lt;br&gt;
      RAISERROR(@errormsg,16,1)&lt;br&gt;
      SET @ret = 1&lt;br&gt;
   END&lt;br&gt;
   &lt;br&gt;
   -- if we created a file make sure we write trailer and destroy object&lt;br&gt;
   IF @filecrt = 1&lt;br&gt;
   BEGIN&lt;br&gt;
      -- write final part of report&lt;br&gt;
      EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
      SET @output = 'Expressmaint processing finished at ' + CONVERT(varchar(25),GETDATE(),100) &lt;br&gt;
                  + ' (Return Code : ' + CAST(@ret as varchar(10)) + ')' &lt;br&gt;
      IF @debug = 1 PRINT @output&lt;br&gt;
      EXEC sp_OAMethod @file,'WriteLine',NULL,@output&lt;br&gt;
      EXEC sp_OAMethod @file,'WriteLine',NULL,''&lt;br&gt;
&lt;br&gt;
      -- destroy file object&lt;br&gt;
      EXEC @hr=sp_OADestroy @file&lt;br&gt;
      IF @hr &lt;&gt; 0 EXEC sp_OAGetErrorInfo @file&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
   IF @report = 1&lt;br&gt;
   BEGIN&lt;br&gt;
      EXEC @hr=sp_OADestroy @fso&lt;br&gt;
      IF @hr &lt;&gt; 0 EXEC sp_OAGetErrorInfo @fso&lt;br&gt;
   END&lt;br&gt;
&lt;br&gt;
RETURN @ret&lt;br&gt;
GO&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;</description><pubDate>Wed, 19 Mar 2008 14:31:45 GMT</pubDate><dc:creator>Keith Chisarik</dc:creator></item><item><title>RE: Backup a Database</title><link>http://forum.strataframe.net/FindPost15036.aspx</link><description>I'm not sure either, but I'd lookup how to run a backup/restore in SQL Books online.  I know it can be done via a script. The tricky part is likely that you'd need to specify a device to backup to that was relative to the machine SQL Server is located on.  Once you know what the script is you can easily run it via a BO or just straight ADO.net.&lt;br&gt;
&lt;br&gt;
The SF team uses SQL Management Objects (SMO) for the DDT, which allows for normal .NET programing to do these sorts of things.  I'd investigate that also.  Hopefully Ben or Trent will pipe in here and provide more specific info. :D</description><pubDate>Wed, 19 Mar 2008 14:11:24 GMT</pubDate><dc:creator>Greg McGuffey</dc:creator></item><item><title>RE: Backup a Database</title><link>http://forum.strataframe.net/FindPost15033.aspx</link><description>Hi Geoff,&lt;/P&gt;&lt;P&gt;Sorry I can not offer any help on this one, but I am very interested in the results of this thread since I have an application that will be use by independent customers with MS-SQL-EXPRESS and a backup solution would be very good to have.</description><pubDate>Wed, 19 Mar 2008 12:23:59 GMT</pubDate><dc:creator>Edhy Rijo</dc:creator></item></channel></rss>