<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>SQL Server - Database Administration</title>
        <link>http://weblogs.sqlteam.com/tarad/category/95.aspx</link>
        <description>SQL Server - Database Administration</description>
        <language>en-US</language>
        <copyright>Tara Kizer</copyright>
        <managingEditor>tara.kizer@gmail.com</managingEditor>
        <generator>Subtext Version 1.9.4.0</generator>
        <item>
            <title>SQL Server jobs on production instances</title>
            <link>http://weblogs.sqlteam.com/tarad/archive/2008/06/30/SQL-Server-jobs-on-production-instances.aspx</link>
            <description>&lt;p&gt;The most important thing that a Database Administrator does is backups.  To automate them, we schedule them as jobs.  But what other jobs are important on SQL Server instances?&lt;/p&gt;
&lt;p&gt;Here are the jobs that I have on every SQL Server 2005 production instance:&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="2" width="797" border="1"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="140"&gt;
            &lt;p align="center"&gt;Name&lt;/p&gt;
            &lt;/td&gt;
            &lt;td valign="top" width="293"&gt;
            &lt;p align="center"&gt;Code&lt;/p&gt;
            &lt;/td&gt;
            &lt;td valign="top" width="126"&gt;
            &lt;p align="center"&gt;Schedule&lt;/p&gt;
            &lt;/td&gt;
            &lt;td valign="top" width="236"&gt;
            &lt;p align="center"&gt;Notes&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="140"&gt;Backup System Databases&lt;/td&gt;
            &lt;td valign="top" width="295"&gt;
            &lt;p&gt;EXEC &lt;a target="_blank" href="http://weblogs.sqlteam.com/tarad/archive/2008/05/21/60606.aspx"&gt;isp_Backup&lt;/a&gt; &lt;br /&gt;
                @path = 'F:\Backup\', &lt;br /&gt;
                @dbType = 'System', &lt;br /&gt;
                @bkpType = 'Full', &lt;br /&gt;
                @retention = 5, &lt;br /&gt;
                @liteSpeed = 'N'&lt;/p&gt;
            &lt;/td&gt;
            &lt;td valign="top" width="126"&gt;Daily&lt;/td&gt;
            &lt;td valign="top" width="235"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="140"&gt;Backup Transaction Logs&lt;/td&gt;
            &lt;td valign="top" width="296"&gt;
            &lt;p&gt;EXEC &lt;a target="_blank" href="http://weblogs.sqlteam.com/tarad/archive/2008/05/21/60606.aspx"&gt;isp_Backup&lt;/a&gt; &lt;br /&gt;
                @path = 'F:\Backup\', &lt;br /&gt;
                @dbType = 'User', &lt;br /&gt;
                @bkpType = 'TLog', &lt;br /&gt;
                @retention = 5, &lt;br /&gt;
                @liteSpeed = 'Y'&lt;/p&gt;
            &lt;/td&gt;
            &lt;td valign="top" width="126"&gt;Every 15 minutes&lt;/td&gt;
            &lt;td valign="top" width="234"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="140"&gt;Backup User Databases&lt;/td&gt;
            &lt;td valign="top" width="297"&gt;
            &lt;p&gt;EXEC &lt;a target="_blank" href="http://weblogs.sqlteam.com/tarad/archive/2008/05/21/60606.aspx"&gt;isp_Backup&lt;/a&gt; &lt;br /&gt;
                @path = 'F:\Backup\', &lt;br /&gt;
                @dbType = 'User', &lt;br /&gt;
                @bkpType = 'Full', &lt;br /&gt;
                @retention = 5, &lt;br /&gt;
                @liteSpeed = 'Y'&lt;/p&gt;
            &lt;/td&gt;
            &lt;td valign="top" width="125"&gt;Daily&lt;/td&gt;
            &lt;td valign="top" width="234"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="140"&gt;Defragment Indexes&lt;/td&gt;
            &lt;td valign="top" width="298"&gt;
            &lt;p&gt;EXEC &lt;a target="_blank" href="http://weblogs.sqlteam.com/tarad/archive/2007/11/27/60415.aspx"&gt;isp_ALTER_INDEX&lt;/a&gt; &lt;br /&gt;
                @dbName = @dbName, &lt;br /&gt;
                @statsMode = 'SAMPLED', &lt;br /&gt;
                @defragType = 'REBUILD', &lt;br /&gt;
                @minFragPercent = 10, &lt;br /&gt;
                @maxFragPercent = 100, &lt;br /&gt;
                @minRowCount = 1000&lt;/p&gt;
            &lt;/td&gt;
            &lt;td valign="top" width="125"&gt;Daily or weekly&lt;/td&gt;
            &lt;td valign="top" width="234"&gt;Loop through each database, see &lt;a target="_blank" href="http://weblogs.sqlteam.com/tarad/archive/2007/11/28/60417.aspx"&gt;this&lt;/a&gt; for sample code.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="140"&gt;Delete Backup History&lt;/td&gt;
            &lt;td valign="top" width="298"&gt;
            &lt;p&gt;DECLARE @d datetime &lt;/p&gt;
            &lt;p&gt;SET @d = DATEADD(day, -30, GETDATE()) &lt;/p&gt;
            &lt;p&gt;EXEC msdb.dbo.sp_delete_backuphistory @d&lt;/p&gt;
            &lt;/td&gt;
            &lt;td valign="top" width="125"&gt;Daily or weekly&lt;/td&gt;
            &lt;td valign="top" width="234"&gt;See &lt;a target="_blank" href="http://weblogs.sqlteam.com/tarad/archive/2008/06/18/How-to-delete-backup-and-restore-history-from-msdb.aspx"&gt;this&lt;/a&gt; for more details.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="140"&gt;Delete Database Mail History&lt;/td&gt;
            &lt;td valign="top" width="298"&gt;
            &lt;p&gt;DECLARE @d datetime &lt;/p&gt;
            &lt;p&gt;SET @d = DATEADD(dd, -5, GETDATE()) &lt;/p&gt;
            &lt;p&gt;EXEC msdb.dbo.sysmail_delete_mailitems_sp &lt;br /&gt;
                @sent_before = @d&lt;/p&gt;
            &lt;/td&gt;
            &lt;td valign="top" width="125"&gt;Daily or weekly&lt;/td&gt;
            &lt;td valign="top" width="234"&gt;Needed only on systems that send mail with attachments using Database Mail. &lt;br /&gt;
            &lt;br /&gt;
            See &lt;a target="_blank" href="http://weblogs.sqlteam.com/tarad/archive/2008/04/28/60575.aspx"&gt;this&lt;/a&gt; for more details.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="140"&gt;Integrity Checks&lt;/td&gt;
            &lt;td valign="top" width="298"&gt;EXEC &lt;a target="_blank" href="http://weblogs.sqlteam.com/tarad/archive/2007/02/07/60081.aspx"&gt;isp_DBCC_CHECKDB&lt;/a&gt;&lt;/td&gt;
            &lt;td valign="top" width="125"&gt;Daily&lt;/td&gt;
            &lt;td valign="top" width="234"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="140"&gt;Update Statistics&lt;/td&gt;
            &lt;td valign="top" width="299"&gt;
            &lt;p&gt;EXEC &lt;a target="_blank" href="http://weblogs.sqlteam.com/tarad/archive/2006/08/14/11194.aspx"&gt;isp_UPDATE_STATISTICS&lt;/a&gt; &lt;br /&gt;
                    @dbName = @dbName, &lt;br /&gt;
                    @sample = 25&lt;/p&gt;
            &lt;/td&gt;
            &lt;td valign="top" width="125"&gt;Daily&lt;/td&gt;
            &lt;td valign="top" width="234"&gt;Might not be needed if your indexes are getting defragmented daily. &lt;br /&gt;
            &lt;br /&gt;
            Loop through each database, see &lt;a target="_blank" href="http://weblogs.sqlteam.com/tarad/archive/2007/11/28/60417.aspx"&gt;this&lt;/a&gt; for sample code.&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; Do you have any jobs that you put on every production SQL Server instance that I didn't cover?  If you do, I'd love to hear from you.&lt;/p&gt;&lt;img src="http://weblogs.sqlteam.com/tarad/aggbug/60643.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tara Kizer</dc:creator>
            <guid>http://weblogs.sqlteam.com/tarad/archive/2008/06/30/SQL-Server-jobs-on-production-instances.aspx</guid>
            <pubDate>Mon, 30 Jun 2008 16:46:36 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/tarad/comments/60643.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/tarad/archive/2008/06/30/SQL-Server-jobs-on-production-instances.aspx#feedback</comments>
            <slash:comments>12</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/tarad/comments/commentRss/60643.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Idera's SQL admin toolset</title>
            <link>http://weblogs.sqlteam.com/tarad/archive/2008/06/11/Ideras-SQL-admin-toolset.aspx</link>
            <description>&lt;p&gt;We are required to start auditing our SQL Servers for various data points.  We did not want to write a custom tool if at all possible, so we started looking for third-party products.  We found &lt;a href="http://www.idera.com/"&gt;Idera&lt;/a&gt;'s &lt;a href="http://www.idera.com/Products/sqladmintoolset/default.aspx"&gt;SQL admin toolset&lt;/a&gt;.  It doesn't collect all of the information that we want to audit, but it's a great start.&lt;/p&gt;
&lt;p&gt;Excerpt from their site about the tool:&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;&lt;font color="#339966"&gt;Are you a DBA or developer tired of spending countless hours on routine administrative and troubleshooting tasks, like figuring out why a user can't connect, or moving databases, or producing reports for your boss to show that the backups really did run, or finding rogue SQL Servers, or checking configurations or…. yeah, we know, the list is endless.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#339966"&gt;If the answer is yes then, you need our SQL admin toolset. Packed with 24 powerful tools that will make troubleshooting, administration and reporting such a breeze you'll be wondering what to do with all the spare time you have on your hands - really! Download now and see.&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;I do not work for Idera.  I am not getting paid to write this nor was I asked to write this.  I found this tool to be so useful that I wanted to bring it to other's attention, especially since it's free to use right now.&lt;/p&gt;&lt;img src="http://weblogs.sqlteam.com/tarad/aggbug/60626.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tara Kizer</dc:creator>
            <guid>http://weblogs.sqlteam.com/tarad/archive/2008/06/11/Ideras-SQL-admin-toolset.aspx</guid>
            <pubDate>Wed, 11 Jun 2008 20:43:16 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/tarad/comments/60626.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/tarad/archive/2008/06/11/Ideras-SQL-admin-toolset.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/tarad/comments/commentRss/60626.aspx</wfw:commentRss>
        </item>
        <item>
            <title>How to troubleshoot SQL Server connectivity problems</title>
            <link>http://weblogs.sqlteam.com/tarad/archive/2008/05/23/60609.aspx</link>
            <description>&lt;p&gt;We often get asked in the &lt;a target="_blank" href="http://www.sqlteam.com"&gt;SQLTeam&lt;/a&gt; &lt;a target="_blank" href="http://www.sqlteam.com/forums"&gt;forums&lt;/a&gt; why they can't connect to a SQL Server instance.  They provide the typical connectivity error.  &lt;/p&gt;
&lt;p&gt;In SQL Server 2000, the error is: &lt;/p&gt;
&lt;p&gt;&lt;font color="#ff0000"&gt;SQL Server does not exist or access denied.&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;In SQL Server 2005, the error is: &lt;/p&gt;
&lt;p&gt;&lt;font color="#ff0000"&gt;An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections.&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;Both errors are misleading as they are not usually resolved by providing access or enabling remote connections.  In fact, I've never seen the SQL Server 2000 error to be as a result of lack of access.  If someone doesn't have access, they will get the "Login failed" error.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=90787"&gt;Here&lt;/a&gt; is an example thread where I helped the original poster and someone who hijacked the thread get connected to their respective SQL Server instances.  &lt;a target="_blank" href="http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=101037"&gt;Here&lt;/a&gt; is another example.  &lt;/p&gt;
&lt;p&gt;Recently, I found &lt;a target="_blank" href="http://blogs.msdn.com/sql_protocols/archive/2006/09/30/SQL-Server-2005-Remote-Connectivity-Issue-TroubleShooting.aspx"&gt;this MSDN blog post&lt;/a&gt;.  It has a bunch of typographical errors, but it is very detailed and should help resolve most connection problems.  The most important typo is netstat is spelled as netstate.  If the user doesn't realize that the command is netstat, they will get an error which could lead them in the wrong direction when troubleshooting this issue.  Hopefully the blog post will get corrected at some point.&lt;/p&gt;
&lt;p&gt;Rather than linking to the SQLTeam threads I mentioned above when I see new threads with these errors, I will now be pointing them to this blog post.  Between the 3 links, the person should be able to resolve their problem.  &lt;/p&gt;&lt;img src="http://weblogs.sqlteam.com/tarad/aggbug/60609.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tara Kizer</dc:creator>
            <guid>http://weblogs.sqlteam.com/tarad/archive/2008/05/23/60609.aspx</guid>
            <pubDate>Fri, 23 May 2008 17:53:54 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/tarad/comments/60609.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/tarad/archive/2008/05/23/60609.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/tarad/comments/commentRss/60609.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Backup databases stored procedure - new version</title>
            <link>http://weblogs.sqlteam.com/tarad/archive/2008/05/21/60606.aspx</link>
            <description>&lt;p&gt;I have updated my backup stored procedure, isp_Backup, as the old version had two issues. It did not exclude database snapshots, which can't be backed up. It also was not checking for the number of CPUs in the registry properly. The CPU check only affects backups when SQL Litespeed is used. &lt;/p&gt;
&lt;p&gt;In the next version, I will exclude those databases that are being log shipped by SQL Litespeed as we don't want to interfere with the LSNs. I am already checking for this condition for native backups. I will also add code to perform a full backup when it is performing a differential or transaction log backup and a full backup does not exist. This will be done to avoid backup errors. &lt;/p&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #ff0000; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #ff00dc; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;
&lt;pre class="csharpcode"&gt;
--------------------------------------------------------------------------------------------------&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- OBJECT NAME            : isp_Backup&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- AUTHOR               : Tara Kizer&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- INPUTS                : @path - location of the backups, default backup directory used if @path is null&lt;/span&gt;
&lt;span class="rem"&gt;--                          @dbType - which database(s) to backup&lt;/span&gt;
&lt;span class="rem"&gt;--                            All, System, User, or dash followed by database name (ex. -Toolbox)&lt;/span&gt;
&lt;span class="rem"&gt;--                          @bkpType - type of backup to perform&lt;/span&gt;
&lt;span class="rem"&gt;--                            Full, TLog, Diff&lt;/span&gt;
&lt;span class="rem"&gt;--                          @retention - number of days to retain backups, -1 to retain all files&lt;/span&gt;
&lt;span class="rem"&gt;--                          @liteSpeed - perform backup using LiteSpeed (Imceda product)&lt;/span&gt;
&lt;span class="rem"&gt;--                            N, Y&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- OUTPUTS                : None&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- RETURN CODES            : 0-10 (see @error table variable at the end for the messages)&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- DEPENDENCIES            : None&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- DESCRIPTION            : Performs backups.&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- EXAMPLES (optional)  : EXEC isp_Backup @path = 'C:\MSSQL\Backup\', @dbType = 'All', @bkpType = 'Full', @retention = 5, @liteSpeed = 'N'&lt;/span&gt;
--------------------------------------------------------------------------------------------------&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;PROC&lt;/span&gt; [dbo].[isp_Backup]
(@&lt;span class="kwrd"&gt;path&lt;/span&gt; &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(100), @dbType sysname = &lt;span class="str"&gt;'All'&lt;/span&gt;, @bkpType &lt;span class="kwrd"&gt;char&lt;/span&gt;(4) = &lt;span class="str"&gt;'Full'&lt;/span&gt;, @retention &lt;span class="kwrd"&gt;smallint&lt;/span&gt; = 2, @liteSpeed &lt;span class="kwrd"&gt;char&lt;/span&gt;(1) = &lt;span class="str"&gt;'N'&lt;/span&gt;)
&lt;span class="kwrd"&gt;AS&lt;/span&gt;

&lt;span class="kwrd"&gt;SET&lt;/span&gt; NOCOUNT &lt;span class="kwrd"&gt;ON&lt;/span&gt;

&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @now &lt;span class="kwrd"&gt;char&lt;/span&gt;(14)             &lt;span class="rem"&gt;-- current date in the form of yyyymmddhhmmss&lt;/span&gt;
&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @dbName sysname         &lt;span class="rem"&gt;-- database name that is currently being processed&lt;/span&gt;
&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @cmd nvarchar(4000)     &lt;span class="rem"&gt;-- dynamically created DOS command&lt;/span&gt;
&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @&lt;span class="kwrd"&gt;result&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;             &lt;span class="rem"&gt;-- result of the dir DOS command&lt;/span&gt;
&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @rowCnt &lt;span class="kwrd"&gt;int&lt;/span&gt;             &lt;span class="rem"&gt;-- @@ROWCOUNT&lt;/span&gt;
&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @fileName &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(200)    &lt;span class="rem"&gt;-- path and file name of the BAK file&lt;/span&gt;
&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @edition &lt;span class="kwrd"&gt;int&lt;/span&gt;            &lt;span class="rem"&gt;-- edition of SQL Server (1 - Personal or Desktop Engine; 2 - Standard; 3 - Developer or Enterprise)&lt;/span&gt;
&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @rc &lt;span class="kwrd"&gt;int&lt;/span&gt;                    &lt;span class="rem"&gt;-- return code&lt;/span&gt;
&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @extension &lt;span class="kwrd"&gt;char&lt;/span&gt;(4)        &lt;span class="rem"&gt;-- extension for backup file&lt;/span&gt;
&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @version &lt;span class="kwrd"&gt;char&lt;/span&gt;(1)        &lt;span class="rem"&gt;-- one digit version number, i.e. 8 (2000) or 9 (2005)&lt;/span&gt;

&lt;span class="rem"&gt;-- log shipping tables have been renamed in 2005&lt;/span&gt;
&lt;span class="kwrd"&gt;SET&lt;/span&gt; @version = &lt;span class="kwrd"&gt;CONVERT&lt;/span&gt;(&lt;span class="kwrd"&gt;char&lt;/span&gt;(1), SERVERPROPERTY(&lt;span class="str"&gt;'ProductVersion'&lt;/span&gt;))

&lt;span class="kwrd"&gt;IF&lt;/span&gt; @version &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'8'&lt;/span&gt;, &lt;span class="str"&gt;'9'&lt;/span&gt;)
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 1
    &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
&lt;span class="kwrd"&gt;END&lt;/span&gt;

&lt;span class="rem"&gt;-- Enterprise and Developer editions have msdb.dbo.log_shipping* tables, other editions do not&lt;/span&gt;
&lt;span class="kwrd"&gt;SET&lt;/span&gt; @edition = &lt;span class="kwrd"&gt;CONVERT&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;, SERVERPROPERTY(&lt;span class="str"&gt;'EngineEdition'&lt;/span&gt;))

&lt;span class="rem"&gt;-- validate input parameters&lt;/span&gt;
&lt;span class="kwrd"&gt;IF&lt;/span&gt; @dbType &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;AND&lt;/span&gt; @dbType &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'All'&lt;/span&gt;, &lt;span class="str"&gt;'System'&lt;/span&gt;, &lt;span class="str"&gt;'User'&lt;/span&gt;) &lt;span class="kwrd"&gt;AND&lt;/span&gt; @dbType &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;LIKE&lt;/span&gt; &lt;span class="str"&gt;'-%'&lt;/span&gt;
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 2
    &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
&lt;span class="kwrd"&gt;END&lt;/span&gt;

&lt;span class="kwrd"&gt;IF&lt;/span&gt; @dbType &lt;span class="kwrd"&gt;LIKE&lt;/span&gt; &lt;span class="str"&gt;'-%'&lt;/span&gt; &lt;span class="kwrd"&gt;AND&lt;/span&gt; @version = &lt;span class="str"&gt;'8'&lt;/span&gt;
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;EXISTS&lt;/span&gt; (&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.dbo.sysdatabases &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; [name] = &lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(@dbType, 2, DATALENGTH(@dbType)))
    &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 3
        &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
    &lt;span class="kwrd"&gt;END&lt;/span&gt;
&lt;span class="kwrd"&gt;END&lt;/span&gt;
&lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @dbType &lt;span class="kwrd"&gt;LIKE&lt;/span&gt; &lt;span class="str"&gt;'-%'&lt;/span&gt; &lt;span class="kwrd"&gt;AND&lt;/span&gt; @version = &lt;span class="str"&gt;'9'&lt;/span&gt;
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;EXISTS&lt;/span&gt; (&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.sys.databases &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; [name] = &lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(@dbType, 2, DATALENGTH(@dbType)))
    &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 3
        &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
    &lt;span class="kwrd"&gt;END&lt;/span&gt;
&lt;span class="kwrd"&gt;END&lt;/span&gt;

&lt;span class="kwrd"&gt;IF&lt;/span&gt; @bkpType &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;AND&lt;/span&gt; @bkpType &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'Full'&lt;/span&gt;, &lt;span class="str"&gt;'TLog'&lt;/span&gt;, &lt;span class="str"&gt;'Diff'&lt;/span&gt;)
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 4
    &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
&lt;span class="kwrd"&gt;END&lt;/span&gt;

&lt;span class="kwrd"&gt;IF&lt;/span&gt; @dbType = &lt;span class="str"&gt;'System'&lt;/span&gt; &lt;span class="kwrd"&gt;AND&lt;/span&gt; @bkpType &amp;lt;&amp;gt; &lt;span class="str"&gt;'Full'&lt;/span&gt;
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 5
    &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
&lt;span class="kwrd"&gt;END&lt;/span&gt;

&lt;span class="kwrd"&gt;IF&lt;/span&gt; @liteSpeed &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;AND&lt;/span&gt; @liteSpeed &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'N'&lt;/span&gt;, &lt;span class="str"&gt;'Y'&lt;/span&gt;)
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 6
    &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
&lt;span class="kwrd"&gt;END&lt;/span&gt;

&lt;span class="rem"&gt;-- use the default backup directory if @path is null&lt;/span&gt;
&lt;span class="kwrd"&gt;IF&lt;/span&gt; @&lt;span class="kwrd"&gt;path&lt;/span&gt; &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;
    &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; master.dbo.xp_instance_regread N&lt;span class="str"&gt;'HKEY_LOCAL_MACHINE'&lt;/span&gt;,N&lt;span class="str"&gt;'Software\Microsoft\MSSQLServer\MSSQLServer'&lt;/span&gt;,N&lt;span class="str"&gt;'BackupDirectory'&lt;/span&gt;, @&lt;span class="kwrd"&gt;path&lt;/span&gt; &lt;span class="kwrd"&gt;output&lt;/span&gt;, &lt;span class="str"&gt;'no_output'&lt;/span&gt;

&lt;span class="rem"&gt;-- we need the backslash after the path, so add it if it wasn't provided in the input parameter&lt;/span&gt;
&lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="kwrd"&gt;RIGHT&lt;/span&gt;(@&lt;span class="kwrd"&gt;path&lt;/span&gt;, 1) &amp;lt;&amp;gt; &lt;span class="str"&gt;'\'&lt;/span&gt;
    &lt;span class="kwrd"&gt;SET&lt;/span&gt; @&lt;span class="kwrd"&gt;path&lt;/span&gt; = @&lt;span class="kwrd"&gt;path&lt;/span&gt; + &lt;span class="str"&gt;'\'&lt;/span&gt;

&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; #WhichDatabase(dbName SYSNAME &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;)

&lt;span class="rem"&gt;-- put the databases to be backed up into temp table&lt;/span&gt;
&lt;span class="kwrd"&gt;IF&lt;/span&gt; @dbType &lt;span class="kwrd"&gt;LIKE&lt;/span&gt; &lt;span class="str"&gt;'-%'&lt;/span&gt;
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;IF&lt;/span&gt; @bkpType = &lt;span class="str"&gt;'TLog'&lt;/span&gt; &lt;span class="kwrd"&gt;AND&lt;/span&gt; DATABASEPROPERTYEX(&lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(@dbType, 2, DATALENGTH(@dbType)), &lt;span class="str"&gt;'RECOVERY'&lt;/span&gt;) = &lt;span class="str"&gt;'SIMPLE'&lt;/span&gt;
    &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 7
        &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
    &lt;span class="kwrd"&gt;END&lt;/span&gt;
    
    &lt;span class="kwrd"&gt;IF&lt;/span&gt; @edition = 3
    &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
        &lt;span class="kwrd"&gt;IF&lt;/span&gt; @version = &lt;span class="str"&gt;'8'&lt;/span&gt;
        &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
            &lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="kwrd"&gt;EXISTS&lt;/span&gt; (&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; msdb.dbo.log_shipping_databases &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; database_name = &lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(@dbType, 2, DATALENGTH(@dbType)))
            &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
                &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 8
                &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
            &lt;span class="kwrd"&gt;END&lt;/span&gt;
        &lt;span class="kwrd"&gt;END&lt;/span&gt;
        &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @version = &lt;span class="str"&gt;'9'&lt;/span&gt; 
        &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
            &lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="kwrd"&gt;EXISTS&lt;/span&gt; (&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; msdb.dbo.log_shipping_primary_databases &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; primary_database = &lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(@dbType, 2, DATALENGTH(@dbType)))
            &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
                &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 8
                &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
            &lt;span class="kwrd"&gt;END&lt;/span&gt;
        &lt;span class="kwrd"&gt;END&lt;/span&gt;
    &lt;span class="kwrd"&gt;END&lt;/span&gt;

    &lt;span class="kwrd"&gt;IF&lt;/span&gt; @version = &lt;span class="str"&gt;'9'&lt;/span&gt;
    &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
        &lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="kwrd"&gt;EXISTS&lt;/span&gt; (&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.sys.databases &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; [name] = &lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(@dbType, 2, DATALENGTH(@dbType)) &lt;span class="kwrd"&gt;AND&lt;/span&gt; source_database_id &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;)
        &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
            &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 11
            &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
        &lt;span class="kwrd"&gt;END&lt;/span&gt;
    &lt;span class="kwrd"&gt;END&lt;/span&gt;

    &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; #WhichDatabase(dbName)
    &lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(&lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(@dbType, 2, DATALENGTH(@dbType))) 
&lt;span class="kwrd"&gt;END&lt;/span&gt;
&lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @dbType = &lt;span class="str"&gt;'All'&lt;/span&gt; 
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;IF&lt;/span&gt; @edition = 3 &lt;span class="kwrd"&gt;AND&lt;/span&gt; @version = &lt;span class="str"&gt;'8'&lt;/span&gt;
        &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; #WhichDatabase (dbName)
        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [name]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.dbo.sysdatabases
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; 
            [name] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'tempdb'&lt;/span&gt;, &lt;span class="str"&gt;'ReportServerTempDB'&lt;/span&gt;) &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            [name] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; database_name &lt;span class="kwrd"&gt;FROM&lt;/span&gt; msdb.dbo.log_shipping_databases) &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'IsInStandBy'&lt;/span&gt;) = 0 &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'Status'&lt;/span&gt;) = &lt;span class="str"&gt;'ONLINE'&lt;/span&gt;
        &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; [name]
    &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @edition = 3 &lt;span class="kwrd"&gt;AND&lt;/span&gt; @version = &lt;span class="str"&gt;'9'&lt;/span&gt;
        &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; #WhichDatabase (dbName)
        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [name]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.sys.databases
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; 
            [name] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'tempdb'&lt;/span&gt;, &lt;span class="str"&gt;'ReportServerTempDB'&lt;/span&gt;) &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            [name] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; primary_database &lt;span class="kwrd"&gt;FROM&lt;/span&gt; msdb.dbo.log_shipping_primary_databases) &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'IsInStandBy'&lt;/span&gt;) = 0 &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'Status'&lt;/span&gt;) = &lt;span class="str"&gt;'ONLINE'&lt;/span&gt;
        &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; [name]
    &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @version = &lt;span class="str"&gt;'8'&lt;/span&gt;
        &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; #WhichDatabase (dbName)
        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [name]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.dbo.sysdatabases
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; 
            [name] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'tempdb'&lt;/span&gt;, &lt;span class="str"&gt;'ReportServerTempDB'&lt;/span&gt;) &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'IsInStandBy'&lt;/span&gt;) = 0 &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'Status'&lt;/span&gt;) = &lt;span class="str"&gt;'ONLINE'&lt;/span&gt;
        &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; [name]
    &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="rem"&gt;-- version is 9&lt;/span&gt;
        &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; #WhichDatabase (dbName)
        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [name]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.sys.databases
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; 
            [name] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'tempdb'&lt;/span&gt;, &lt;span class="str"&gt;'ReportServerTempDB'&lt;/span&gt;) &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'IsInStandBy'&lt;/span&gt;) = 0 &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'Status'&lt;/span&gt;) = &lt;span class="str"&gt;'ONLINE'&lt;/span&gt;
        &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; [name]
&lt;span class="kwrd"&gt;END&lt;/span&gt;
&lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @dbType = &lt;span class="str"&gt;'System'&lt;/span&gt;
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;IF&lt;/span&gt; @version = 8
        &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; #WhichDatabase (dbName)
        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [name]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.dbo.sysdatabases
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; [name] &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'master'&lt;/span&gt;, &lt;span class="str"&gt;'model'&lt;/span&gt;, &lt;span class="str"&gt;'msdb'&lt;/span&gt;)
        &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; [name]
    &lt;span class="kwrd"&gt;ELSE&lt;/span&gt;
        &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; #WhichDatabase (dbName)
        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [name]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.sys.databases
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; [name] &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'master'&lt;/span&gt;, &lt;span class="str"&gt;'model'&lt;/span&gt;, &lt;span class="str"&gt;'msdb'&lt;/span&gt;)
        &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; [name]
&lt;span class="kwrd"&gt;END&lt;/span&gt;
&lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @dbType = &lt;span class="str"&gt;'User'&lt;/span&gt;
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;IF&lt;/span&gt; @edition = 3 &lt;span class="kwrd"&gt;AND&lt;/span&gt; @version = &lt;span class="str"&gt;'8'&lt;/span&gt;
        &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; #WhichDatabase (dbName)
        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [name]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.dbo.sysdatabases
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; 
            [name] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'master'&lt;/span&gt;, &lt;span class="str"&gt;'model'&lt;/span&gt;, &lt;span class="str"&gt;'msdb'&lt;/span&gt;, &lt;span class="str"&gt;'tempdb'&lt;/span&gt;, &lt;span class="str"&gt;'ReportServerTempDB'&lt;/span&gt;) &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            [name] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; database_name &lt;span class="kwrd"&gt;FROM&lt;/span&gt; msdb.dbo.log_shipping_databases) &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'IsInStandBy'&lt;/span&gt;) = 0 &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'Status'&lt;/span&gt;) = &lt;span class="str"&gt;'ONLINE'&lt;/span&gt;
        &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; [name]
    &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @edition = 3 &lt;span class="kwrd"&gt;AND&lt;/span&gt; @version = &lt;span class="str"&gt;'9'&lt;/span&gt;
        &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; #WhichDatabase (dbName)
        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [name]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.sys.databases
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; 
            [name] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'master'&lt;/span&gt;, &lt;span class="str"&gt;'model'&lt;/span&gt;, &lt;span class="str"&gt;'msdb'&lt;/span&gt;, &lt;span class="str"&gt;'tempdb'&lt;/span&gt;, &lt;span class="str"&gt;'ReportServerTempDB'&lt;/span&gt;) &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            [name] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; primary_database &lt;span class="kwrd"&gt;FROM&lt;/span&gt; msdb.dbo.log_shipping_primary_databases) &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'IsInStandBy'&lt;/span&gt;) = 0 &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'Status'&lt;/span&gt;) = &lt;span class="str"&gt;'ONLINE'&lt;/span&gt;
        &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; [name]
    &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @version = &lt;span class="str"&gt;'8'&lt;/span&gt;
        &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; #WhichDatabase (dbName)
        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [name]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.dbo.sysdatabases
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; 
            [name] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'master'&lt;/span&gt;, &lt;span class="str"&gt;'model'&lt;/span&gt;, &lt;span class="str"&gt;'msdb'&lt;/span&gt;, &lt;span class="str"&gt;'tempdb'&lt;/span&gt;, &lt;span class="str"&gt;'ReportServerTempDB'&lt;/span&gt;) &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'IsInStandBy'&lt;/span&gt;) = 0 &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'Status'&lt;/span&gt;) = &lt;span class="str"&gt;'ONLINE'&lt;/span&gt;
        &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; [name]
    &lt;span class="kwrd"&gt;ELSE&lt;/span&gt;
        &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; #WhichDatabase (dbName)
        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; [name]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.sys.databases
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; 
            [name] &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'master'&lt;/span&gt;, &lt;span class="str"&gt;'model'&lt;/span&gt;, &lt;span class="str"&gt;'msdb'&lt;/span&gt;, &lt;span class="str"&gt;'tempdb'&lt;/span&gt;, &lt;span class="str"&gt;'ReportServerTempDB'&lt;/span&gt;) &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'IsInStandBy'&lt;/span&gt;) = 0 &lt;span class="kwrd"&gt;AND&lt;/span&gt;
            DATABASEPROPERTYEX([name], &lt;span class="str"&gt;'Status'&lt;/span&gt;) = &lt;span class="str"&gt;'ONLINE'&lt;/span&gt;
        &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; [name]
&lt;span class="kwrd"&gt;END&lt;/span&gt;
&lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="rem"&gt;-- no databases to be backed up&lt;/span&gt;
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 9
    &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
&lt;span class="kwrd"&gt;END&lt;/span&gt;

&lt;span class="rem"&gt;-- Remove snapshots&lt;/span&gt;
&lt;span class="kwrd"&gt;IF&lt;/span&gt; @version = &lt;span class="str"&gt;'9'&lt;/span&gt;
    &lt;span class="kwrd"&gt;DELETE&lt;/span&gt; t
    &lt;span class="kwrd"&gt;FROM&lt;/span&gt; #WhichDatabase t 
    &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt; master.sys.databases d
    &lt;span class="kwrd"&gt;ON&lt;/span&gt; t.dbName = d.[name]
    &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; d.source_database_id &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;

&lt;span class="rem"&gt;-- Get the database to be backed up&lt;/span&gt;
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;span class="kwrd"&gt;TOP&lt;/span&gt; 1 @dbName = dbName
&lt;span class="kwrd"&gt;FROM&lt;/span&gt; #WhichDatabase

&lt;span class="kwrd"&gt;SET&lt;/span&gt; @rowCnt = &lt;span class="preproc"&gt;@@ROWCOUNT&lt;/span&gt;

&lt;span class="rem"&gt;-- Iterate throught the temp table until no more databases need to be backed up&lt;/span&gt;
&lt;span class="kwrd"&gt;WHILE&lt;/span&gt; @rowCnt &amp;lt;&amp;gt; 0
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt; 

    &lt;span class="kwrd"&gt;IF&lt;/span&gt; @bkpType = &lt;span class="str"&gt;'TLog'&lt;/span&gt; &lt;span class="kwrd"&gt;AND&lt;/span&gt; @dbType &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'All'&lt;/span&gt;, &lt;span class="str"&gt;'User'&lt;/span&gt;) &lt;span class="kwrd"&gt;AND&lt;/span&gt; DATABASEPROPERTYEX(@dbName, &lt;span class="str"&gt;'RECOVERY'&lt;/span&gt;) = &lt;span class="str"&gt;'SIMPLE'&lt;/span&gt;
        &lt;span class="kwrd"&gt;PRINT&lt;/span&gt; &lt;span class="str"&gt;'Skipping transaction log backup of '&lt;/span&gt; + @dbName
    &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @bkpType = &lt;span class="str"&gt;'Diff'&lt;/span&gt; &lt;span class="kwrd"&gt;AND&lt;/span&gt; @dbName &lt;span class="kwrd"&gt;IN&lt;/span&gt; (&lt;span class="str"&gt;'master'&lt;/span&gt;, &lt;span class="str"&gt;'model'&lt;/span&gt;, &lt;span class="str"&gt;'msdb'&lt;/span&gt;)
        &lt;span class="kwrd"&gt;PRINT&lt;/span&gt; &lt;span class="str"&gt;'Skipping differential backup of '&lt;/span&gt; + @dbName
    &lt;span class="kwrd"&gt;ELSE&lt;/span&gt;
    &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
        &lt;span class="rem"&gt;-- Build the dir command that will check to see if the directory exists&lt;/span&gt;
        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @cmd = &lt;span class="str"&gt;'dir '&lt;/span&gt; + @&lt;span class="kwrd"&gt;path&lt;/span&gt; + @dbName
    
        &lt;span class="rem"&gt;-- Run the dir command, put output of xp_cmdshell into @result&lt;/span&gt;
        &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; @&lt;span class="kwrd"&gt;result&lt;/span&gt; = master..xp_cmdshell @cmd, NO_OUTPUT
    
        &lt;span class="rem"&gt;-- If the directory does not exist, we must create it&lt;/span&gt;
        &lt;span class="kwrd"&gt;IF&lt;/span&gt; @&lt;span class="kwrd"&gt;result&lt;/span&gt; &amp;lt;&amp;gt; 0
        &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
            &lt;span class="rem"&gt;-- Build the mkdir command        &lt;/span&gt;
            &lt;span class="kwrd"&gt;SET&lt;/span&gt; @cmd = &lt;span class="str"&gt;'mkdir '&lt;/span&gt; + @&lt;span class="kwrd"&gt;path&lt;/span&gt; + @dbName
    
            &lt;span class="rem"&gt;-- Create the directory&lt;/span&gt;
            &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; master..xp_cmdshell @cmd, NO_OUTPUT
    
            &lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="preproc"&gt;@@ERROR&lt;/span&gt; &amp;lt;&amp;gt; 0
            &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
                &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 10
                &lt;span class="kwrd"&gt;GOTO&lt;/span&gt; EXIT_ROUTINE
            &lt;span class="kwrd"&gt;END&lt;/span&gt;
        &lt;span class="kwrd"&gt;END&lt;/span&gt;
        &lt;span class="rem"&gt;-- The directory exists, so let's delete files older than two days&lt;/span&gt;
        &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @retention &amp;lt;&amp;gt; -1
        &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
            &lt;span class="rem"&gt;-- Stores the name of the file to be deleted&lt;/span&gt;
            &lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @whichFile &lt;span class="kwrd"&gt;VARCHAR&lt;/span&gt;(1000)
    
            &lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; #DeleteOldFiles(DirInfo &lt;span class="kwrd"&gt;VARCHAR&lt;/span&gt;(7000))
    
            &lt;span class="rem"&gt;-- Build the command that will list out all of the files in a directory&lt;/span&gt;
            &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @cmd = &lt;span class="str"&gt;'dir '&lt;/span&gt; + @&lt;span class="kwrd"&gt;path&lt;/span&gt; + @dbName + &lt;span class="str"&gt;' /OD'&lt;/span&gt;
    
            &lt;span class="rem"&gt;-- Run the dir command and put the results into a temp table&lt;/span&gt;
            &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; #DeleteOldFiles
            &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; master..xp_cmdshell @cmd
    
            &lt;span class="rem"&gt;-- Delete all rows from the temp table except the ones that correspond to the files to be deleted&lt;/span&gt;
            &lt;span class="kwrd"&gt;DELETE&lt;/span&gt; &lt;span class="kwrd"&gt;FROM&lt;/span&gt; #DeleteOldFiles
            &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; ISDATE(&lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(DirInfo, 1, 10)) = 0 &lt;span class="kwrd"&gt;OR&lt;/span&gt; DirInfo &lt;span class="kwrd"&gt;LIKE&lt;/span&gt; &lt;span class="str"&gt;'%&amp;lt;DIR&amp;gt;%'&lt;/span&gt; &lt;span class="kwrd"&gt;OR&lt;/span&gt; &lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(DirInfo, 1, 10) &amp;gt;= GETDATE() - @retention
    
            &lt;span class="rem"&gt;-- Get the file name portion of the row that corresponds to the file to be deleted&lt;/span&gt;
            &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;span class="kwrd"&gt;TOP&lt;/span&gt; 1 @whichFile = &lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(DirInfo, LEN(DirInfo) -  PATINDEX(&lt;span class="str"&gt;'% %'&lt;/span&gt;, REVERSE(DirInfo)) + 2, LEN(DirInfo)) 
            &lt;span class="kwrd"&gt;FROM&lt;/span&gt; #DeleteOldFiles        
    
            &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rowCnt = &lt;span class="preproc"&gt;@@ROWCOUNT&lt;/span&gt;
            
            &lt;span class="rem"&gt;-- Interate through the temp table until there are no more files to delete&lt;/span&gt;
            &lt;span class="kwrd"&gt;WHILE&lt;/span&gt; @rowCnt &amp;lt;&amp;gt; 0
            &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
                &lt;span class="rem"&gt;-- Build the del command&lt;/span&gt;
                &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @cmd = &lt;span class="str"&gt;'del '&lt;/span&gt; + @&lt;span class="kwrd"&gt;path&lt;/span&gt; + + @dbName + &lt;span class="str"&gt;'\'&lt;/span&gt; + @whichFile + &lt;span class="str"&gt;' /Q /F'&lt;/span&gt;
                
                &lt;span class="rem"&gt;-- Delete the file&lt;/span&gt;
                &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; master..xp_cmdshell @cmd, NO_OUTPUT
                
                &lt;span class="rem"&gt;-- To move to the next file, the current file name needs to be deleted from the temp table&lt;/span&gt;
                &lt;span class="kwrd"&gt;DELETE&lt;/span&gt; &lt;span class="kwrd"&gt;FROM&lt;/span&gt; #DeleteOldFiles
                &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; &lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(DirInfo, LEN(DirInfo) -  PATINDEX(&lt;span class="str"&gt;'% %'&lt;/span&gt;, REVERSE(DirInfo)) + 2, LEN(DirInfo))  = @whichFile
    
                &lt;span class="rem"&gt;-- Get the file name portion of the row that corresponds to the file to be deleted&lt;/span&gt;
                &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;span class="kwrd"&gt;TOP&lt;/span&gt; 1 @whichFile = &lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(DirInfo, LEN(DirInfo) -  PATINDEX(&lt;span class="str"&gt;'% %'&lt;/span&gt;, REVERSE(DirInfo)) + 2, LEN(DirInfo)) 
                &lt;span class="kwrd"&gt;FROM&lt;/span&gt; #DeleteOldFiles
            
                &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rowCnt = &lt;span class="preproc"&gt;@@ROWCOUNT&lt;/span&gt;
            &lt;span class="kwrd"&gt;END&lt;/span&gt;
            &lt;span class="kwrd"&gt;DROP&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; #DeleteOldFiles
        &lt;span class="kwrd"&gt;END&lt;/span&gt;
        &lt;span class="rem"&gt;-- Get the current date using style 120, remove all dashes, spaces, and colons&lt;/span&gt;
        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @now = REPLACE(REPLACE(REPLACE(&lt;span class="kwrd"&gt;CONVERT&lt;/span&gt;(&lt;span class="kwrd"&gt;VARCHAR&lt;/span&gt;(50), GETDATE(), 120), &lt;span class="str"&gt;'-'&lt;/span&gt;, &lt;span class="str"&gt;''&lt;/span&gt;), &lt;span class="str"&gt;' '&lt;/span&gt;, &lt;span class="str"&gt;''&lt;/span&gt;), &lt;span class="str"&gt;':'&lt;/span&gt;, &lt;span class="str"&gt;''&lt;/span&gt;)
    
        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @extension =
            &lt;span class="kwrd"&gt;CASE&lt;/span&gt;
                &lt;span class="kwrd"&gt;WHEN&lt;/span&gt; @bkpType = &lt;span class="str"&gt;'Full'&lt;/span&gt; &lt;span class="kwrd"&gt;THEN&lt;/span&gt; &lt;span class="str"&gt;'.BAK'&lt;/span&gt;
                &lt;span class="kwrd"&gt;WHEN&lt;/span&gt; @bkpType = &lt;span class="str"&gt;'TLog'&lt;/span&gt; &lt;span class="kwrd"&gt;THEN&lt;/span&gt; &lt;span class="str"&gt;'.TRN'&lt;/span&gt;
                &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="str"&gt;'.DIF'&lt;/span&gt;
            &lt;span class="kwrd"&gt;END&lt;/span&gt;
    
        &lt;span class="rem"&gt;-- Build the backup path and file name, backup the database&lt;/span&gt;
        &lt;span class="kwrd"&gt;IF&lt;/span&gt; @liteSpeed = &lt;span class="str"&gt;'N'&lt;/span&gt;
        &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
            &lt;span class="kwrd"&gt;SET&lt;/span&gt; @fileName = @&lt;span class="kwrd"&gt;path&lt;/span&gt; + @dbName + &lt;span class="str"&gt;'\'&lt;/span&gt; + @dbName + &lt;span class="str"&gt;'_'&lt;/span&gt; + @now + @extension
            &lt;span class="kwrd"&gt;IF&lt;/span&gt; @bkpType = &lt;span class="str"&gt;'FULL'&lt;/span&gt;
                &lt;span class="kwrd"&gt;BACKUP&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; @dbName
                &lt;span class="kwrd"&gt;TO&lt;/span&gt; &lt;span class="kwrd"&gt;DISK&lt;/span&gt; = @filename
                &lt;span class="kwrd"&gt;WITH&lt;/span&gt; INIT
            &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @bkpType = &lt;span class="str"&gt;'DIFF'&lt;/span&gt;
                &lt;span class="kwrd"&gt;BACKUP&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; @dbName
                &lt;span class="kwrd"&gt;TO&lt;/span&gt; &lt;span class="kwrd"&gt;DISK&lt;/span&gt; = @filename
                &lt;span class="kwrd"&gt;WITH&lt;/span&gt; INIT, DIFFERENTIAL
            &lt;span class="kwrd"&gt;ELSE&lt;/span&gt;
                &lt;span class="kwrd"&gt;BACKUP&lt;/span&gt; LOG @dbName
                &lt;span class="kwrd"&gt;TO&lt;/span&gt; &lt;span class="kwrd"&gt;DISK&lt;/span&gt; = @filename
                &lt;span class="kwrd"&gt;WITH&lt;/span&gt; INIT    
        &lt;span class="kwrd"&gt;END&lt;/span&gt;
        &lt;span class="kwrd"&gt;ELSE&lt;/span&gt;
        &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
            &lt;span class="kwrd"&gt;SET&lt;/span&gt; @fileName = @&lt;span class="kwrd"&gt;path&lt;/span&gt; + @dbName + &lt;span class="str"&gt;'\'&lt;/span&gt; + @dbName + &lt;span class="str"&gt;'_LS_'&lt;/span&gt; + @now + @extension
    
            &lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @regOutput &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(20) &lt;span class="rem"&gt;-- stores the output from the registry&lt;/span&gt;
            &lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @numProcs &lt;span class="kwrd"&gt;INT&lt;/span&gt; &lt;span class="rem"&gt;-- stores the number of processors that the server has registered&lt;/span&gt;

            &lt;span class="rem"&gt;-- Get the number of processors that the server has&lt;/span&gt;
            &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; master..xp_regread 
                  @rootkey = &lt;span class="str"&gt;'HKEY_LOCAL_MACHINE'&lt;/span&gt;, 
                  @&lt;span class="kwrd"&gt;key&lt;/span&gt; = &lt;span class="str"&gt;'SYSTEM\CurrentControlSet\Control\Session Manager\Environment\'&lt;/span&gt;,
                  @value_name = &lt;span class="str"&gt;'NUMBER_OF_PROCESSORS'&lt;/span&gt;,
                  @&lt;span class="kwrd"&gt;value&lt;/span&gt; = @regOutput &lt;span class="kwrd"&gt;OUTPUT&lt;/span&gt;
            
            &lt;span class="rem"&gt;--  We want n - 1 threads, where n is the number of processors&lt;/span&gt;
            &lt;span class="kwrd"&gt;SET&lt;/span&gt; @numProcs = &lt;span class="kwrd"&gt;CONVERT&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;, @regOutput) - 1
    
            &lt;span class="kwrd"&gt;IF&lt;/span&gt; @bkpType = &lt;span class="str"&gt;'FULL'&lt;/span&gt;
                &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; master.dbo.xp_backup_database
                    @&lt;span class="kwrd"&gt;database&lt;/span&gt; = @dbName,
                    @filename = @fileName,
                    @threads = @numProcs,
                    @init = 1
            &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; &lt;span class="kwrd"&gt;IF&lt;/span&gt; @bkpType = &lt;span class="str"&gt;'DIFF'&lt;/span&gt;
                &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; master.dbo.xp_backup_database
                    @&lt;span class="kwrd"&gt;database&lt;/span&gt; = @dbName,
                    @filename = @fileName,
                    @threads = @numProcs,
                    @init = 1,
                    @&lt;span class="kwrd"&gt;with&lt;/span&gt; = &lt;span class="str"&gt;'DIFFERENTIAL'&lt;/span&gt;
            &lt;span class="kwrd"&gt;ELSE&lt;/span&gt;
                &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; master.dbo.xp_backup_log
                    @&lt;span class="kwrd"&gt;database&lt;/span&gt; = @dbName,
                    @filename = @fileName,
                    @threads = @numProcs,
                    @init = 1
        &lt;span class="kwrd"&gt;END&lt;/span&gt;
    &lt;span class="kwrd"&gt;END&lt;/span&gt;
        &lt;span class="rem"&gt;-- To move onto the next database, the current database name needs to be deleted from the temp table&lt;/span&gt;
        &lt;span class="kwrd"&gt;DELETE&lt;/span&gt; &lt;span class="kwrd"&gt;FROM&lt;/span&gt; #WhichDatabase
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; dbName = @dbName
    
        &lt;span class="rem"&gt;-- Get the database to be backed up&lt;/span&gt;
        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;span class="kwrd"&gt;TOP&lt;/span&gt; 1 @dbName = dbName
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; #WhichDatabase
    
        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @rowCnt = &lt;span class="preproc"&gt;@@ROWCOUNT&lt;/span&gt;
        
        &lt;span class="rem"&gt;-- Let the system rest for 5 seconds before starting on the next backup&lt;/span&gt;
        &lt;span class="kwrd"&gt;WAITFOR&lt;/span&gt; DELAY &lt;span class="str"&gt;'00:00:05'&lt;/span&gt;
&lt;span class="kwrd"&gt;END&lt;/span&gt;

&lt;span class="kwrd"&gt;SET&lt;/span&gt; @rc = 0

EXIT_ROUTINE:

&lt;span class="kwrd"&gt;IF&lt;/span&gt; @rc &amp;lt;&amp;gt; 0
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @rm &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(500)
    &lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @error &lt;span class="kwrd"&gt;table&lt;/span&gt; (returnCode &lt;span class="kwrd"&gt;int&lt;/span&gt; &lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt; &lt;span class="kwrd"&gt;KEY&lt;/span&gt; &lt;span class="kwrd"&gt;CLUSTERED&lt;/span&gt;, returnMessage &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(500))

    &lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; @error(returnCode, returnMessage)
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;  0, &lt;span class="str"&gt;'Success'&lt;/span&gt; &lt;span class="kwrd"&gt;UNION&lt;/span&gt; &lt;span class="kwrd"&gt;ALL&lt;/span&gt;
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;  1, &lt;span class="str"&gt;'Version is not 2000 or 2005'&lt;/span&gt; &lt;span class="kwrd"&gt;UNION&lt;/span&gt; &lt;span class="kwrd"&gt;ALL&lt;/span&gt;
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;  2, &lt;span class="str"&gt;'Invalid option passed to @dbType'&lt;/span&gt; &lt;span class="kwrd"&gt;UNION&lt;/span&gt; &lt;span class="kwrd"&gt;ALL&lt;/span&gt;
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;  3, &lt;span class="str"&gt;'Database passed to @dbType does not exist'&lt;/span&gt; &lt;span class="kwrd"&gt;UNION&lt;/span&gt; &lt;span class="kwrd"&gt;ALL&lt;/span&gt;
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;  4, &lt;span class="str"&gt;'Invalid option passed to @bkpType'&lt;/span&gt; &lt;span class="kwrd"&gt;UNION&lt;/span&gt; &lt;span class="kwrd"&gt;ALL&lt;/span&gt;
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;  5, &lt;span class="str"&gt;'Only full backups are allowed on system databases'&lt;/span&gt; &lt;span class="kwrd"&gt;UNION&lt;/span&gt; &lt;span class="kwrd"&gt;ALL&lt;/span&gt;
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;  6, &lt;span class="str"&gt;'Invalid option passed to @liteSpeed'&lt;/span&gt; &lt;span class="kwrd"&gt;UNION&lt;/span&gt; &lt;span class="kwrd"&gt;ALL&lt;/span&gt;
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;  7, &lt;span class="str"&gt;'Can not backup tlog when using SIMPLE recovery model'&lt;/span&gt; &lt;span class="kwrd"&gt;UNION&lt;/span&gt; &lt;span class="kwrd"&gt;ALL&lt;/span&gt;
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;  8, &lt;span class="str"&gt;'Will not backup the tlog on a log shipped database'&lt;/span&gt; &lt;span class="kwrd"&gt;UNION&lt;/span&gt; &lt;span class="kwrd"&gt;ALL&lt;/span&gt;
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;  9, &lt;span class="str"&gt;'No databases to be backed up'&lt;/span&gt; &lt;span class="kwrd"&gt;UNION&lt;/span&gt; &lt;span class="kwrd"&gt;ALL&lt;/span&gt;
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; 10, &lt;span class="str"&gt;'Unable to create directory'&lt;/span&gt; &lt;span class="kwrd"&gt;UNION&lt;/span&gt; &lt;span class="kwrd"&gt;ALL&lt;/span&gt;
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; 11, &lt;span class="str"&gt;'Can not backup database snapshots'&lt;/span&gt;

    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @rm = returnMessage 
    &lt;span class="kwrd"&gt;FROM&lt;/span&gt; @error 
    &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; returnCode = @rc

    &lt;span class="kwrd"&gt;RAISERROR&lt;/span&gt;(@rm, 16, 1)
&lt;span class="kwrd"&gt;END&lt;/span&gt;

&lt;span class="kwrd"&gt;RETURN&lt;/span&gt; @rc
&lt;/pre&gt;&lt;img src="http://weblogs.sqlteam.com/tarad/aggbug/60606.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tara Kizer</dc:creator>
            <guid>http://weblogs.sqlteam.com/tarad/archive/2008/05/21/60606.aspx</guid>
            <pubDate>Wed, 21 May 2008 17:05:43 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/tarad/comments/60606.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/tarad/archive/2008/05/21/60606.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/tarad/comments/commentRss/60606.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Optimizing tempdb</title>
            <link>http://weblogs.sqlteam.com/tarad/archive/2008/05/20/60604.aspx</link>
            <description>&lt;p&gt;&lt;font face="Arial"&gt;To improve query performance when you've found tempdb to be a performance bottleneck, you can create multiple data files of equal size.  It is recommended that you add one file per CPU (per core, not per socket).  The below script will do this for you.  It is written as a stored procedure as I like to keep all of my scripts in an admin-type database.  You will probably only run this once per instance though.  &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;To determine how big each file should be, look at the size of your tempdb's data file which by default is named tempdb.mdf.  You should check the file size after your system has been running for a while after a reboot or a restart of the SQL Server service.  For instance, we typically reboot our database servers once a month due to the monthly Microsoft security patches.  In my environment, I would check the file size about 30 days after the reboot so that I know it is at its typical maximum value. &lt;br /&gt;
 &lt;br /&gt;
As an example, if the file size is 8 GB and you've got 8 CPUs, then I would suggest passing a minimum of 1024 to the stored procedure as the inputs accept megabytes.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;You should run the stored procedure after a reboot or a restart of the SQL Server service so that tempdb is at its smallest, which should avoid any errors.  &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;If you've already set the initial size of tempdb to be greater than the value passed to the stored procedure, it will error as you can not reduce the setting with ALTER DATABASE.  You must first set the initial size to a lower value.  I have only seen one way to do this, which can be found in &lt;a href="http://sql-server-performance.com/Community/forums/p/23813/135241.aspx"&gt;this thread&lt;/a&gt;.  Check out rklime's post on 10-23-2007 at 10:05 AM.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;This tempdb architecture is described in SQL Server Books Online.  &lt;a href="http://msdn.microsoft.com/en-us/library/ms175527.aspx"&gt;Here&lt;/a&gt; is the online reference for the article.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Although &lt;a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/workingwithtempdb.mspx"&gt;this TechNet article&lt;/a&gt; is long, it is a must read for database administrators as it goes into great detail about tempdb.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Here is the stored procedure:  &lt;/p&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #ff0000; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #ff00dc; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;--------------------------------------------------------------------------------------------------&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- OBJECT NAME        : isp_AddTempdbFiles&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- AUTHOR            : Tara Kizer&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- DATE                : May 13, 2008&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- INPUTS            : @size - size of the tempdb files in megabytes&lt;/span&gt;
&lt;span class="rem"&gt;--                      @growth - growth increment of the tempdb files in megabytes&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- OUTPUTS            : None&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- RETURN CODES        : None&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- DESCRIPTION        : Adds one tempdb file per CPU&lt;/span&gt;
&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="rem"&gt;-- EXAMPLE            : EXEC isp_AddTempdbFiles @size = 1024, @growth = 200&lt;/span&gt;
--------------------------------------------------------------------------------------------------&lt;span class="rem"&gt;--&lt;/span&gt;
&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;PROC&lt;/span&gt; [dbo].[isp_AddTempdbFiles]
(@&lt;span class="kwrd"&gt;size&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;, @growth &lt;span class="kwrd"&gt;int&lt;/span&gt;)
&lt;span class="kwrd"&gt;AS&lt;/span&gt;

&lt;span class="kwrd"&gt;SET&lt;/span&gt; NOCOUNT &lt;span class="kwrd"&gt;ON&lt;/span&gt;

&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; 
    @regOutput &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(20), @numProcs &lt;span class="kwrd"&gt;int&lt;/span&gt;, @&lt;span class="kwrd"&gt;sql&lt;/span&gt; nvarchar(4000), @tempdbDataFileCount tinyint, @tempdbDataFileSize &lt;span class="kwrd"&gt;int&lt;/span&gt;,
    @tempdbFirstLogicalName sysname, @tempdbDataFileId tinyint, @i tinyint, @j tinyint,
    @tempdbMissingDataFileCount tinyint, @tempdbLogicalName sysname, @tempdbFirstPhysicalPath nvarchar(260)

&lt;span class="kwrd"&gt;EXEC&lt;/span&gt; master..xp_regread 
      @rootkey = &lt;span class="str"&gt;'HKEY_LOCAL_MACHINE'&lt;/span&gt;, 
      @&lt;span class="kwrd"&gt;key&lt;/span&gt; = &lt;span class="str"&gt;'SYSTEM\CurrentControlSet\Control\Session Manager\Environment\'&lt;/span&gt;,
      @value_name = &lt;span class="str"&gt;'NUMBER_OF_PROCESSORS'&lt;/span&gt;,
      @&lt;span class="kwrd"&gt;value&lt;/span&gt; = @regOutput &lt;span class="kwrd"&gt;OUTPUT&lt;/span&gt;

&lt;span class="kwrd"&gt;SET&lt;/span&gt; @numProcs = @regOutput

&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @i = 2, @j = 2, @tempdbDataFileCount = &lt;span class="kwrd"&gt;COUNT&lt;/span&gt;(*), @tempdbDataFileId = &lt;span class="kwrd"&gt;MIN&lt;/span&gt;(file_id) 
&lt;span class="kwrd"&gt;FROM&lt;/span&gt; tempdb.sys.database_files 
&lt;span class="kwrd"&gt;WHERE&lt;/span&gt; type = 0

&lt;span class="kwrd"&gt;SET&lt;/span&gt; @tempdbMissingDataFileCount = @numProcs - @tempdbDataFileCount

&lt;span class="kwrd"&gt;IF&lt;/span&gt; @tempdbDataFileCount &amp;lt;&amp;gt; @numProcs
&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
    &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; 
        @tempdbFirstLogicalName = name, 
        @tempdbFirstPhysicalPath = 
            &lt;span class="kwrd"&gt;SUBSTRING&lt;/span&gt;(physical_name, 1, LEN(physical_name) - CHARINDEX(&lt;span class="str"&gt;'\'&lt;/span&gt;, REVERSE(physical_name )) + 1)
    &lt;span class="kwrd"&gt;FROM&lt;/span&gt; tempdb.sys.database_files 
    &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; file_id = @tempdbDataFileId

    &lt;span class="kwrd"&gt;SET&lt;/span&gt; @tempdbDataFileId = 0

    &lt;span class="rem"&gt;-- file exists, expand it, if necessary. to make sure they will all be the same&lt;/span&gt;
    &lt;span class="kwrd"&gt;WHILE&lt;/span&gt; @tempdbDataFileCount &amp;lt;&amp;gt; 0
    &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @tempdbDataFileId = &lt;span class="kwrd"&gt;MIN&lt;/span&gt;(file_id)
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; tempdb.sys.database_files
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; type = 0 &lt;span class="kwrd"&gt;AND&lt;/span&gt; file_id &amp;gt; @tempdbDataFileId

        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; @tempdbLogicalName = name, @tempdbDataFileSize = &lt;span class="kwrd"&gt;size&lt;/span&gt;
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; tempdb.sys.database_files 
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; file_id = @tempdbDataFileId

        &lt;span class="kwrd"&gt;IF&lt;/span&gt; @&lt;span class="kwrd"&gt;size&lt;/span&gt;*1024/8 &amp;gt; @tempdbDataFileSize
        &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
            &lt;span class="kwrd"&gt;SET&lt;/span&gt; @&lt;span class="kwrd"&gt;sql&lt;/span&gt; = &lt;span class="str"&gt;'ALTER DATABASE tempdb MODIFY FILE (NAME = N'&lt;/span&gt;&lt;span class="str"&gt;''&lt;/span&gt; + @tempdbLogicalName + &lt;span class="str"&gt;''&lt;/span&gt;&lt;span class="str"&gt;', SIZE = '&lt;/span&gt; 
            &lt;span class="kwrd"&gt;SET&lt;/span&gt; @&lt;span class="kwrd"&gt;sql&lt;/span&gt; = @&lt;span class="kwrd"&gt;sql&lt;/span&gt; + &lt;span class="kwrd"&gt;CONVERT&lt;/span&gt;(&lt;span class="kwrd"&gt;varchar&lt;/span&gt;(10), @&lt;span class="kwrd"&gt;size&lt;/span&gt;) + &lt;span class="str"&gt;'MB, FILEGROWTH = '&lt;/span&gt; + &lt;span class="kwrd"&gt;CONVERT&lt;/span&gt;(&lt;span class="kwrd"&gt;varchar&lt;/span&gt;(10), @growth) + &lt;span class="str"&gt;'MB)'&lt;/span&gt;
            --&lt;span class="kwrd"&gt;PRINT&lt;/span&gt; @&lt;span class="kwrd"&gt;sql&lt;/span&gt;
            &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; (@&lt;span class="kwrd"&gt;sql&lt;/span&gt;)
        &lt;span class="kwrd"&gt;END&lt;/span&gt;

        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @tempdbDataFileCount = @tempdbDataFileCount - 1
    &lt;span class="kwrd"&gt;END&lt;/span&gt;

    &lt;span class="rem"&gt;-- missing files&lt;/span&gt;
    &lt;span class="kwrd"&gt;WHILE&lt;/span&gt; @tempdbMissingDataFileCount &amp;lt;&amp;gt; 0
    &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
        &lt;span class="kwrd"&gt;WHILE&lt;/span&gt; 1 = 1
        &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
            &lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="kwrd"&gt;EXISTS&lt;/span&gt; 
            (
                &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * 
                &lt;span class="kwrd"&gt;FROM&lt;/span&gt; tempdb.sys.database_files 
                &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; name = @tempdbFirstLogicalName + &lt;span class="kwrd"&gt;CONVERT&lt;/span&gt;(&lt;span class="kwrd"&gt;varchar&lt;/span&gt;(3), @i)
            )
                &lt;span class="kwrd"&gt;SET&lt;/span&gt; @i = @i + 1
            &lt;span class="kwrd"&gt;ELSE&lt;/span&gt;
                &lt;span class="kwrd"&gt;BREAK&lt;/span&gt;
        &lt;span class="kwrd"&gt;END&lt;/span&gt;

        &lt;span class="kwrd"&gt;WHILE&lt;/span&gt; 1 = 1
        &lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;
            &lt;span class="kwrd"&gt;IF&lt;/span&gt; &lt;span class="kwrd"&gt;EXISTS&lt;/span&gt; 
            (
                &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * 
                &lt;span class="kwrd"&gt;FROM&lt;/span&gt; tempdb.sys.database_files 
                &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; physical_name = @tempdbFirstPhysicalPath + @tempdbFirstLogicalName + &lt;span class="kwrd"&gt;CONVERT&lt;/span&gt;(&lt;span class="kwrd"&gt;varchar&lt;/span&gt;(3), @j) + &lt;span class="str"&gt;'.ndf'&lt;/span&gt;
            )
                &lt;span class="kwrd"&gt;SET&lt;/span&gt; @j = @j + 1
            &lt;span class="kwrd"&gt;ELSE&lt;/span&gt;
                &lt;span class="kwrd"&gt;BREAK&lt;/span&gt;
        &lt;span class="kwrd"&gt;END&lt;/span&gt;

        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @&lt;span class="kwrd"&gt;sql&lt;/span&gt; = &lt;span class="str"&gt;'ALTER DATABASE tempdb ADD FILE (NAME = N'&lt;/span&gt;&lt;span class="str"&gt;''&lt;/span&gt; + @tempdbFirstLogicalName + &lt;span class="kwrd"&gt;CONVERT&lt;/span&gt;(&lt;span class="kwrd"&gt;varchar&lt;/span&gt;(3), @i)
        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @&lt;span class="kwrd"&gt;sql&lt;/span&gt; = @&lt;span class="kwrd"&gt;sql&lt;/span&gt; + &lt;span class="str"&gt;''&lt;/span&gt;&lt;span class="str"&gt;', FILENAME = N'&lt;/span&gt;&lt;span class="str"&gt;''&lt;/span&gt; + @tempdbFirstPhysicalPath + @tempdbFirstLogicalName + &lt;span class="kwrd"&gt;CONVERT&lt;/span&gt;(&lt;span class="kwrd"&gt;varchar&lt;/span&gt;(3), @j)
        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @&lt;span class="kwrd"&gt;sql&lt;/span&gt; = @&lt;span class="kwrd"&gt;sql&lt;/span&gt; + &lt;span class="str"&gt;'.ndf'&lt;/span&gt; + &lt;span class="str"&gt;''&lt;/span&gt;&lt;span class="str"&gt;', SIZE = '&lt;/span&gt; + &lt;span class="kwrd"&gt;CONVERT&lt;/span&gt;(&lt;span class="kwrd"&gt;varchar&lt;/span&gt;(10), @&lt;span class="kwrd"&gt;size&lt;/span&gt;) + &lt;span class="str"&gt;'MB, FILEGROWTH = '&lt;/span&gt;
        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @&lt;span class="kwrd"&gt;sql&lt;/span&gt; = @&lt;span class="kwrd"&gt;sql&lt;/span&gt; + &lt;span class="kwrd"&gt;CONVERT&lt;/span&gt;(&lt;span class="kwrd"&gt;varchar&lt;/span&gt;(10), @growth) + &lt;span class="str"&gt;'MB)'&lt;/span&gt;
        --&lt;span class="kwrd"&gt;PRINT&lt;/span&gt; @&lt;span class="kwrd"&gt;sql&lt;/span&gt;
        &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; (@&lt;span class="kwrd"&gt;sql&lt;/span&gt;)

        &lt;span class="kwrd"&gt;SET&lt;/span&gt; @tempdbMissingDataFileCount = @tempdbMissingDataFileCount - 1
    &lt;span class="kwrd"&gt;END&lt;/span&gt;
&lt;span class="kwrd"&gt;END&lt;/span&gt;

&lt;/pre&gt;&lt;img src="http://weblogs.sqlteam.com/tarad/aggbug/60604.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tara Kizer</dc:creator>
            <guid>http://weblogs.sqlteam.com/tarad/archive/2008/05/20/60604.aspx</guid>
            <pubDate>Tue, 20 May 2008 18:17:25 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/tarad/comments/60604.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/tarad/archive/2008/05/20/60604.aspx#feedback</comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/tarad/comments/commentRss/60604.aspx</wfw:commentRss>
        </item>
        <item>
            <title>How to properly check for data corruption via a SQL job</title>
            <link>http://weblogs.sqlteam.com/tarad/archive/2008/05/06/60590.aspx</link>
            <description>&lt;p&gt;I recently found out that we are not properly checking for data corruption in our "Integrity Checks" SQL job.  I thought that a SQL job would fail if the job step that runs DBCC CHECKDB returned errors, but apparently that's not the case.  Check out Paul Randal's &lt;a href="http://www.sqlskills.com/blogs/paul/2008/03/13/CHECKDBFromEveryAngleWhenDidDBCCCHECKDBLastRunSuccessfully.aspx"&gt;blog&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;To properly check for data corruption via a SQL job, you should raise an error if @@ERROR does not equal zero.&lt;/p&gt;
&lt;p&gt;In the next few days, I'll rewrite my &lt;a href="http://weblogs.sqlteam.com/tarad/archive/2007/02/07/60081.aspx"&gt;isp_DBCC_CHECKDB&lt;/a&gt; stored procedure to include this.  I will be testing my code change against a database that contains corruption.  See &lt;a href="http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=102337"&gt;this thread&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;UPDATE: We were unable to find a case where the job would show success, yet data corruption exists.  Check out Paul's blog and the thread that I mentioned for more details.&lt;/p&gt;&lt;img src="http://weblogs.sqlteam.com/tarad/aggbug/60590.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tara Kizer</dc:creator>
            <guid>http://weblogs.sqlteam.com/tarad/archive/2008/05/06/60590.aspx</guid>
            <pubDate>Tue, 06 May 2008 23:13:58 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/tarad/comments/60590.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/tarad/archive/2008/05/06/60590.aspx#feedback</comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/tarad/comments/commentRss/60590.aspx</wfw:commentRss>
        </item>
        <item>
            <title>How to failover Database Mirroring in SQL Server 2005 using T-SQL </title>
            <link>http://weblogs.sqlteam.com/tarad/archive/2008/05/04/60585.aspx</link>
            <description>&lt;style type="text/css"&gt;&lt;![CDATA[








.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #ff0000; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #ff00dc; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;
&lt;p&gt;I've previously shown &lt;a href="http://weblogs.sqlteam.com/tarad/archive/2007/02/13/60091.aspx"&gt;how to setup Database Mirroring in SQL Server 2005 with T-SQL&lt;/a&gt;, but how do you failover to the mirrored databases using T-SQL?  Here's how:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;--Run on principal&lt;/span&gt;
&lt;span class="kwrd"&gt;USE master&lt;/span&gt;
&lt;span class="kwrd"&gt;GO&lt;/span&gt;

&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; dbName &lt;span class="kwrd"&gt;SET SAFETY FULL&lt;/span&gt;
&lt;span class="kwrd"&gt;GO&lt;/span&gt;
&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; dbName &lt;span class="kwrd"&gt;SET PARTNER FAILOVER&lt;/span&gt;
GO&lt;/pre&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;--Run on new principal&lt;/span&gt;
&lt;span class="kwrd"&gt;USE master&lt;/span&gt;
&lt;span class="kwrd"&gt;GO&lt;/span&gt;

&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; dbName &lt;span class="kwrd"&gt;SET SAFETY OFF&lt;/span&gt;
GO&lt;/pre&gt;
&lt;p&gt;If you are using synchronous database mirroring, just ignore the "SET SAFETY" commands.  &lt;/p&gt;
&lt;p&gt;We use asynchronous database mirroring for performance reasons as our sites are 300 miles apart.  Even though we have a fast network in between the two sites, the latency is too high when we tried it in synchronous mode.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://weblogs.sqlteam.com/tarad/aggbug/60585.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tara Kizer</dc:creator>
            <guid>http://weblogs.sqlteam.com/tarad/archive/2008/05/04/60585.aspx</guid>
            <pubDate>Sun, 04 May 2008 21:50:14 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/tarad/comments/60585.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/tarad/archive/2008/05/04/60585.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/tarad/comments/commentRss/60585.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Error when installing instance on a cluster</title>
            <link>http://weblogs.sqlteam.com/tarad/archive/2008/04/29/60577.aspx</link>
            <description>&lt;p&gt;If you need to install a SQL Server 2005 instance on a cluster, make sure that there aren't any remote connections to any of the other nodes.  Otherwise, the installation may fail with the following error:&lt;/p&gt;
&lt;p&gt;&lt;font color="#ff0000"&gt;Setup failed to start on the remote machine. Check the Task Scheduler event log on the remote machine.&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;Please refer to &lt;a href="http://support.microsoft.com/kb/910851"&gt;this Knowledge Base article&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;I get this error every now and then and usually can't remember how to resolve it.  Maybe I'll be able to find my own blog entry when I search on the error!&lt;/p&gt;&lt;img src="http://weblogs.sqlteam.com/tarad/aggbug/60577.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tara Kizer</dc:creator>
            <guid>http://weblogs.sqlteam.com/tarad/archive/2008/04/29/60577.aspx</guid>
            <pubDate>Tue, 29 Apr 2008 23:52:48 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/tarad/comments/60577.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/tarad/archive/2008/04/29/60577.aspx#feedback</comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/tarad/comments/commentRss/60577.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Purging Database Mail data from msdb</title>
            <link>http://weblogs.sqlteam.com/tarad/archive/2008/04/28/60575.aspx</link>
            <description>&lt;p&gt;On Sunday morning, I got paged by one of our monitoring systems that we were low on free disk space on one of our production servers.  The specific resource that was low on free disk space was our "Backup" mount point.  Since I didn't think this should be the case for a few more months, I looked into each folder to see if any database backup was larger than it should be.  That's when I noticed that our msdb backups were 6 gigabytes in size.  &lt;/p&gt;
&lt;p&gt;Typically the msdb database is larger than it should be due to backup history, but we already have a job to purge that data.  The job was successful the last time it ran, so I decided to find out if there were any other tables that had an unusual amount of data in them.  SQL Server 2005 makes this easy for us by providing the "Disk Usage by Top Tables" report in Management Studio.  When I viewed this report, I noticed that the sysmail_attachments system table was at the very top.  It showed that the table was consuming 6 gigabytes of space.&lt;/p&gt;
&lt;p&gt;The sysmail_attachments system table is used by Database Mail to store the email attachments.  We have a job that runs hourly that sends an email with an attachment to several people.  The table only had a few thousand rows in it, but it took several minutes to delete everything that was older than a couple of days.  While the delete was running, I checked Books Online to see if there was a system stored procedure to do the purge or if I was going to need to write my own.  I found &lt;span id="nsrTitle"&gt;sysmail_delete_mailitems_sp.  &lt;br /&gt;
&lt;br /&gt;
If you send attachments via Database Mail, I would recommend that you create a job that runs sysmail_delete_mailitems_sp on a scheduled basis, perhaps daily or weekly.  This recommendation can also be found in Books Online in the "Remarks" section of the "sysmail_delete_mailitems_sp" topic.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Here is an example of what to put in the job step:&lt;/span&gt;&lt;/p&gt;
&lt;span&gt;
&lt;p&gt;&lt;font face="Arial"&gt;DECLARE @d datetime&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;SET @d = DATEADD(dd, -5, GETDATE())&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;EXEC msdb.dbo.sysmail_delete_mailitems_sp @sent_before = @d&lt;/font&gt;&lt;/p&gt;
&lt;/span&gt;&lt;font color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;img src="http://weblogs.sqlteam.com/tarad/aggbug/60575.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tara Kizer</dc:creator>
            <guid>http://weblogs.sqlteam.com/tarad/archive/2008/04/28/60575.aspx</guid>
            <pubDate>Mon, 28 Apr 2008 23:04:19 GMT</pubDate>
            <wfw:comment>http://weblogs.sqlteam.com/tarad/comments/60575.aspx</wfw:comment>
            <comments>http://weblogs.sqlteam.com/tarad/archive/2008/04/28/60575.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/tarad/comments/commentRss/60575.aspx</wfw:commentRss>
        </item>
        <item>
            <title>CLR stored procedure to get disk space information</title>
            <link>http://weblogs.sqlteam.com/tarad/archive/2007/12/18/60435.aspx</link>
            <description>&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;
&lt;p&gt;I've seen lots of tools/scripts to get disk space information about a particular SQL Server, but none of them include the information about mount points.  Mount points are now supported in SQL Server 2005.  We implemented them on our production clusters and therefore needed a way to monitor them.  We are now monitoring them with MOM via a Veritas management pack, but before that was implemented we used a CLR stored procedure that I wrote.  It is written in C#.  &lt;/p&gt;
&lt;p&gt;The code allows you to get disk space information for the local server or for remote servers.  You just need to pass the hostname to the stored procedure.&lt;/p&gt;
&lt;p&gt;NOTE: I didn't get a chance to add error handling to this.  I'd love to hear your suggestions on how better to write this, but please be respectful.  I'm only a DBA!  &lt;/p&gt;
&lt;p&gt;C# code:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.SqlClient;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.SqlTypes;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.SqlServer.Server;

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; isp_DiskSpace(&lt;span class="kwrd"&gt;string&lt;/span&gt; serverName)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (serverName == &lt;span class="str"&gt;""&lt;/span&gt;)
        {
            serverName = Environment.MachineName;
        }

        PerformanceCounterCategory pcc = &lt;span class="kwrd"&gt;new&lt;/span&gt; PerformanceCounterCategory(&lt;span class="str"&gt;"LogicalDisk"&lt;/span&gt;, serverName);

        SqlDataRecord record = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlDataRecord(
            &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlMetaData(&lt;span class="str"&gt;"Drive/MountPoint"&lt;/span&gt;, SqlDbType.NVarChar, 256),
            &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlMetaData(&lt;span class="str"&gt;"Capacity (MB)"&lt;/span&gt;, SqlDbType.VarChar, 256),
            &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlMetaData(&lt;span class="str"&gt;"Used Space (MB)"&lt;/span&gt;, SqlDbType.VarChar, 256),
            &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlMetaData(&lt;span class="str"&gt;"Free Space (MB)"&lt;/span&gt;, SqlDbType.VarChar, 256),
            &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlMetaData(&lt;span class="str"&gt;"Percent Free Space"&lt;/span&gt;, SqlDbType.VarChar, 6));

        SqlContext.Pipe.SendResultsStart(record);

        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; instanceName &lt;span class="kwrd"&gt;in&lt;/span&gt; pcc.GetInstanceNames())
        {
            PerformanceCounter pcPercentFree = &lt;span class="kwrd"&gt;new&lt;/span&gt; PerformanceCounter(&lt;span class="str"&gt;"LogicalDisk"&lt;/span&gt;, &lt;span class="str"&gt;"% Free Space"&lt;/span&gt;, instanceName, serverName);
            PerformanceCounter pcFreeMbytes = &lt;span class="kwrd"&gt;new&lt;/span&gt; PerformanceCounter(&lt;span class="str"&gt;"LogicalDisk"&lt;/span&gt;, &lt;span class="str"&gt;"Free Megabytes"&lt;/span&gt;, instanceName, serverName);

            &lt;span class="kwrd"&gt;float&lt;/span&gt; percentfree = pcPercentFree.NextValue();
            &lt;span class="kwrd"&gt;float&lt;/span&gt; freespace = pcFreeMbytes.NextValue();
            &lt;span class="kwrd"&gt;float&lt;/span&gt; capacity = (freespace * 100) / percentfree;
            &lt;span class="kwrd"&gt;float&lt;/span&gt; usedspace = capacity - freespace;

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (instanceName != &lt;span class="str"&gt;"_Total"&lt;/span&gt;)
            {
                record.SetSqlString(0, instanceName);
                record.SetSqlString(1, capacity.ToString());
                record.SetSqlString(2, usedspace.ToString());
                record.SetSqlString(3, freespace.ToString());
                record.SetSqlString(4, percentfree.ToString());
                SqlContext.Pipe.SendResultsRow(record);
            }
        }
        SqlContext.Pipe.SendResultsEnd();
    }
};&lt;/pre&gt;
&lt;p&gt;Once you've compiled the code into a DLL, run the below to get it setup inside SQL Server.&lt;/p&gt;
&lt;p&gt;T-SQL code:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;USE&lt;/span&gt; master
&lt;span class="kwrd"&gt;GO&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_configure &lt;span class="str"&gt;'show advanced options'&lt;/span&gt;, 1&lt;br /&gt;&lt;span class="kwrd"&gt;RECONFIGURE&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_configure &lt;span class="str"&gt;'clr enabled'&lt;/span&gt;, 1&lt;br /&gt;&lt;span class="kwrd"&gt;RECONFIGURE&lt;/span&gt;

&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; &lt;span class="kwrd"&gt;Admin&lt;/span&gt; &lt;span class="kwrd"&gt;SET&lt;/span&gt; TRUSTWORTHY &lt;span class="kwrd"&gt;ON&lt;/span&gt;
&lt;span class="kwrd"&gt;GO&lt;/span&gt;

&lt;span class="kwrd"&gt;USE&lt;/span&gt; &lt;span class="kwrd"&gt;Admin&lt;/span&gt;
&lt;span class="kwrd"&gt;GO&lt;/span&gt;

&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; ASSEMBLY DiskSpace 
&lt;span class="kwrd"&gt;FROM&lt;/span&gt; &lt;span class="str"&gt;'C:\SQLTools\DiskSpace.dll'&lt;/span&gt;
&lt;span class="kwrd"&gt;WITH&lt;/span&gt; PERMISSION_SET = UNSAFE
&lt;span class="kwrd"&gt;GO&lt;/span&gt;

&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;PROC&lt;/span&gt; dbo.isp_DiskSpace @serverName nvarchar(4000)
&lt;span class="kwrd"&gt;WITH&lt;/span&gt; &lt;span class="kwrd"&gt;EXECUTE&lt;/span&gt; &lt;span class="kwrd"&gt;AS&lt;/span&gt; CALLER
&lt;span class="kwrd"&gt;AS&lt;/span&gt;
&lt;span class="kwrd"&gt;EXTERNAL&lt;/span&gt; NAME DiskSpace.StoredProcedures.isp_DiskSpace
&lt;span class="kwrd"&gt;GO&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Example calls:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;--local server&lt;/span&gt;
&lt;span class="kwrd"&gt;EXEC&lt;/span&gt; dbo.isp_DiskSpace @serverName = &lt;span class="str"&gt;''&lt;/span&gt;&lt;/pre&gt;
or
&lt;pre class="csharpcode"&gt;&lt;span class="str"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;EXEC&lt;/span&gt; dbo.isp_DiskSpace @serverName = &lt;span class="str"&gt;'LocalServer'&lt;/span&gt;&lt;br /&gt;

&lt;span class="rem"&gt;--remote server&lt;/span&gt;
&lt;span class="kwrd"&gt;EXEC&lt;/span&gt; dbo.isp_DiskSpace @serverName = &lt;span class="str"&gt;'RemoteServer'&lt;/span&gt;&lt;/pre&gt;&lt;img src="http://weblogs.sqlteam.com/tarad/aggbug/60435.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tara Kizer</dc:creator>
            <guid>http://weblogs.sqlteam.com/tarad/archive/2007/12/18/60435.aspx</guid>
            <pubDate>Tue, 18 Dec 2007 23:45:32 GMT</pubDate>
            <comments>http://weblogs.sqlteam.com/tarad/archive/2007/12/18/60435.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/tarad/comments/commentRss/60435.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>