<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Data Whacking with SQL Server</title>
	<atom:link href="http://sql.guardianbob.net/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://sql.guardianbob.net</link>
	<description>Sharing and Discusssing Data Management with SQL Server</description>
	<lastBuildDate>Mon, 03 Aug 2009 12:16:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>SQL Server Backup Helper Stored Procedures</title>
		<link>http://sql.guardianbob.net/?p=3</link>
		<comments>http://sql.guardianbob.net/?p=3#comments</comments>
		<pubDate>Sat, 01 Aug 2009 21:15:34 +0000</pubDate>
		<dc:creator>Sean</dc:creator>
				<category><![CDATA[SQL Scripts]]></category>
		<category><![CDATA[backups]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://sql.guardianbob.net/?p=3</guid>
		<description><![CDATA[These stored procedures may really come in handy if you are using one of the Express Editions of Microsoft SQL Server.  Once you have added the stored procedures to your master database, you can use Windows Scheduled Tasks (or your own method of choice) to generate database and transaction log backups on a schedule. In [...]]]></description>
			<content:encoded><![CDATA[<p>These stored procedures may really come in handy if you are using one of the Express Editions of Microsoft SQL Server.  Once you have added the stored procedures to your master database, you can use Windows Scheduled Tasks (or your own method of choice) to generate database and transaction log backups on a schedule.</p>
<p>In all cases, replace &#8216;F:\SQLData\SQLBackup&#8217; with the backup folder of your choice.</p>
<p>Here is a command you can then use to generate the database backups if you are using a 2005 version of SQL Server (for 2000,  replace the \90\ with \80\; for 2008, replace the \90\ with a \100\):<br />
C:\Program Files\Microsoft SQL Server\90\Tools\binn&gt;osql -E -Q &#8220;exec [dbo].[usp_BackupAllDatabases] &#8216;F:\SQLData\SQLBackup&#8217;&#8221;</p>
<p>Command to generate the transaction log backups:<br />
C:\Program Files\Microsoft SQL Server\90\Tools\binn&gt;osql -E -Q &#8220;exec [dbo].[usp_BackupAllTransactionLogs] &#8216;F:\SQLData\SQLBackup&#8217;&#8221;</p>
<p>After customizing your database recovery model options in the usp_BackupAllTransactionLogs stored procedure below, you can run this for the first time initialization:</p>
<p>On this first line, you may get errors&#8230; ignore them.<br />
C:\Program Files\Microsoft SQL Server\90\Tools\binn&gt;osql -E -Q &#8220;exec [dbo].[usp_BackupAllTransactionLogs] &#8216;F:\SQLData\SQLBackup&#8217;&#8221;<br />
These two should run without complaining&#8230;<br />
C:\Program Files\Microsoft SQL Server\90\Tools\binn&gt;osql -E -Q &#8220;exec [dbo].[usp_BackupAllDatabases] &#8216;F:\SQLData\SQLBackup&#8217;&#8221;<br />
C:\Program Files\Microsoft SQL Server\90\Tools\binn&gt;osql -E -Q &#8220;exec [dbo].[usp_BackupAllTransactionLogs] &#8216;F:\SQLData\SQLBackup&#8217;&#8221;</p>
<p>[Please note: I have attached the SQL script shown below here: <a href="http://sql.guardianbob.net/wp-content/uploads/2009/08/GernericBackupScripts.sql">Gerneric Backup Scripts for SQL Server</a>; posting the scripts to HTML is mangling the punctuation.]</p>
<p>Here are the scripts:</p>
<blockquote><p>USE [master]<br />
GO</p>
<p>/****** Object:  StoredProcedure [dbo].[sp_what]    Script Date: 08/03/2009 07:50:03 ******/<br />
SET ANSI_NULLS ON<br />
GO</p>
<p>SET QUOTED_IDENTIFIER ON<br />
GO</p>
<p>CREATE PROCEDURE [dbo].[sp_what]<br />
&#8211;    @loginame     sysname = NULL<br />
as<br />
/*</p>
<p>http://www.sqlservercentral.com/scripts/Lock+and+Connection+Management/31690/</p>
<p>By Andrew Stanton<br />
*/<br />
set nocount on</p>
<p>declare<br />
@retcode         int, @loginame  sysname<br />
declare<br />
@sidlow varbinary(85),@sidhigh varbinary(85) ,@sid1 varbinary(85) ,@spidlow int ,@spidhigh int</p>
<p>declare<br />
@charMaxLenLoginName varchar(6),@charMaxLenDBName varchar(6),@charMaxLenCPUTime varchar(10),@charMaxLenDiskIO varchar(10),<br />
@charMaxLenHostName varchar(10),@charMaxLenProgramName varchar(10),@charMaxLenLastBatch varchar(10),@charMaxLenCommand varchar(10)<br />
&#8212;&#8212;&#8211;<br />
select  @retcode         = 0      &#8212; 0=good ,1=bad.<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>if (object_id(&#8216;tempdb..#tb1_sysprocesses&#8217;) is not null)<br />
drop table #tb1_sysprocesses</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;  Capture consistent sysprocesses.  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>SELECT<br />
spid,status,sid,hostname,program_name,cmd,cpu,physical_io,blocked,dbid,<br />
convert(sysname, rtrim(loginame)) as loginname,spid as &#8216;spid_sort&#8217;,<br />
substring( convert(varchar,last_batch,111) ,6  ,5 ) + &#8216; &#8216; + substring( convert(varchar,last_batch,113) ,13 ,8 ) as &#8216;last_batch_char&#8217;,last_batch<br />
INTO    #tb1_sysprocesses<br />
from master.dbo.sysprocesses   (nolock)</p>
<p>&#8212;&#8212;&#8211;Screen out any rows<br />
DELETE #tb1_sysprocesses<br />
where   lower(status)  = &#8216;sleeping&#8217;<br />
and     upper(cmd)    IN (<br />
&#8216;AWAITING COMMAND&#8217;<br />
,&#8217;MIRROR HANDLER&#8217;<br />
,&#8217;LAZY WRITER&#8217;<br />
,&#8217;CHECKPOINT SLEEP&#8217;<br />
,&#8217;RA MANAGER&#8217;<br />
,&#8217;TASK MANAGER&#8217;<br />
)</p>
<p>and     blocked       = 0 or spid &lt;= 50<br />
&#8212;set the column widths<br />
UPDATE #tb1_sysprocesses set last_batch = DATEADD(year,-10,GETDATE())<br />
where last_batch IS NULL or last_batch = &#8217;01/01/1901 00:00:00&#8242; or last_batch &lt; &#8217;01/01/1950&#8242;<br />
update #tb1_sysprocesses set status = substring(status,1,10), program_name = substring(program_name,1,20)<br />
ALTER TABLE #tb1_sysprocesses<br />
ALTER COLUMN status varchar(10)<br />
ALTER TABLE #tb1_sysprocesses<br />
ALTER COLUMN program_name varchar(20)<br />
&#8212;&#8212;&#8211;Prepare to dynamically optimize column widths.<br />
SELECT<br />
@charMaxLenLoginName = convert( varchar ,isnull( max( datalength(loginname)) ,5)),<br />
@charMaxLenDBName = convert( varchar ,isnull( max( datalength( rtrim(convert(varchar(128),db_name(dbid))))) ,6)),<br />
@charMaxLenCPUTime =  convert( varchar,isnull( max( datalength( rtrim(convert(varchar(128),cpu)))) ,7)),<br />
@charMaxLenDiskIO =  convert( varchar,isnull( max( datalength( rtrim(convert(varchar(128),physical_io)))) ,6)),<br />
@charMaxLenCommand = convert( varchar,isnull( max( datalength( rtrim(convert(varchar(128),cmd)))) ,7)),<br />
@charMaxLenHostName  = convert( varchar,isnull( max( datalength( rtrim(convert(varchar(128),hostname)))) ,8)),<br />
@charMaxLenProgramName = convert( varchar,isnull( max( datalength( rtrim(convert(varchar(128),program_name)))) ,11)),<br />
@charMaxLenLastBatch = convert( varchar,isnull( max( datalength( rtrim(convert(varchar(128),last_batch_char)))) ,9))<br />
from<br />
#tb1_sysprocesses<br />
where<br />
spid &gt;= 0 and spid &lt;= 32767</p>
<p>&#8212;&#8212;&#8211;Output the report.</p>
<p>EXECUTE(<br />
&#8216;SET nocount off<br />
SELECT   SPID          = convert(char(5),spid)<br />
,HostName      =<br />
CASE hostname<br />
When Null  Then &#8221;  .&#8221;<br />
When &#8221; &#8221; Then &#8221;  .&#8221;<br />
Else    substring(hostname,1,&#8217; + @charMaxLenHostName + &#8216;)<br />
END<br />
,BlkBy         =<br />
CASE               isnull(convert(char(5),blocked),&#8221;0&#8221;)<br />
When &#8221;0&#8221; Then &#8221;  .&#8221;<br />
Else            isnull(convert(char(5),blocked),&#8221;0&#8221;)<br />
END<br />
,ActiveSeconds = DATEDIFF(ss,last_batch,getdate())<br />
,DBName        = substring(case when dbid = 0 then null when dbid &lt;&gt; 0 then db_name(dbid) end,1,&#8217; + @charMaxLenDBName + &#8216;)<br />
,Command       = substring(cmd,1,&#8217; + @charMaxLenCommand + &#8216;)<br />
,Status        =<br />
CASE lower(status)<br />
When &#8221;sleeping&#8221; Then lower(status)<br />
Else                   upper(status)<br />
END<br />
,BatchStart = CONVERT(varchar(8),last_batch,14)<br />
,Now = CONVERT(varchar(8),getdate(),14)<br />
,LBDate = substring(last_batch_char,1,5)<br />
,ProgramName   = substring(program_name,1,&#8217; + @charMaxLenProgramName + &#8216;)<br />
,Login         = substring(loginname,1,&#8217; + @charMaxLenLoginName + &#8216;)<br />
,CPUTime       = substring(convert(varchar,cpu),1,&#8217; + @charMaxLenCPUTime + &#8216;)<br />
,DiskIO        = substring(convert(varchar,physical_io),1,&#8217; + @charMaxLenDiskIO + &#8216;)<br />
from<br />
#tb1_sysprocesses  &#8211;Usually DB qualification is needed in exec().<br />
order by CAST(SPID as int)<br />
&#8211; (Seems always auto sorted.)   order by SPID<br />
SET nocount on&#8217;)</p>
<p>drop table #tb1_sysprocesses<br />
&#8211;return @retcode</p>
<p>GO</p>
<p>/****** Object: StoredProcedure [dbo].[usp_BackupAllDatabases] Script Date: 07/31/2009 19:04:53 ******/<br />
SET ANSI_NULLS ON<br />
GO</p>
<p>SET QUOTED_IDENTIFIER ON<br />
GO</p>
<p>CREATE PROCEDURE [dbo].[usp_BackupAllDatabases]<br />
@BackupTarget_FullPathToFolder varchar(4000)<br />
, @UseLitespeed int = 0<br />
as</p>
<p>set nocount on</p>
<p>declare @err int<br />
declare @sql varchar(256)<br />
declare @db_name varchar(128)<br />
declare @BackupName varchar(255)</p>
<p>declare @RunDate varchar(255)<br />
set @RunDate = replace(replace(convert(varchar(255), getdate() , 120), &#8216; &#8216;, &#8216;_&#8217;), &#8216;:&#8217;,&#8221;)<br />
&#8212;- select @RunDate</p>
<p>&#8211; Make sure our path ends in a &#8216;\&#8217;…<br />
set @BackupTarget_FullPathToFolder = ltrim(rtrim(@BackupTarget_FullPathToFolder))<br />
if right(@BackupTarget_FullPathToFolder, 1) &lt;&gt; &#8216;\&#8217; set @BackupTarget_FullPathToFolder = @BackupTarget_FullPathToFolder + &#8216;\&#8217;</p>
<p>declare extract CURSOR Local FOR</p>
<p>select<br />
[name]<br />
from<br />
sysdatabases<br />
where<br />
version &lt;&gt; 0<br />
and DATABASEPROPERTYEX(name, &#8216;Status&#8217;) = &#8216;ONLINE&#8217;<br />
and DATABASEPROPERTYEX(name, &#8216;IsInStandBy&#8217;) = 0<br />
and [name] &lt;&gt; &#8216;tempdb&#8217;<br />
and [name] = &#8216;RCRC&#8217;<br />
order by<br />
case when [name] = &#8216;master&#8217; then &#8216;ZZZ&#8217; else [name] end desc</p>
<p>OPEN extract<br />
FETCH NEXT FROM extract<br />
INTO @db_name</p>
<p>WHILE (@@FETCH_STATUS = 0)<br />
BEGIN</p>
<p>set @BackupName = @BackupTarget_FullPathToFolder + @db_name + &#8216;_&#8217; + @RunDate + &#8216;.bak&#8217;</p>
<p>if (@UseLitespeed = 1)<br />
begin</p>
<p>&#8211; LiteSpeed backup…<br />
exec xp_backup_database @database = @db_name, @filename = @BackupName, @init = 1, @logging = 0, @with = &#8216;SKIP&#8217;, @with = &#8216;STATS = 10&#8242;<br />
end<br />
else<br />
begin<br />
&#8211; SQL Server Backup…<br />
set @sql = &#8216;backup database [' + @db_name + '] to disk = &#8221;&#8217;+ @BackupName + &#8221;&#8217; with init&#8217;<br />
exec(@sql)<br />
end</p>
<p>select @err = @@error<br />
if @err &lt;&gt; 0 print ltrim(rtrim(str(@@error)))</p>
<p>&#8211; Shrink Database<br />
&#8211; As per Microsoft, avoid shrinking / regrowing the tempdb<br />
&#8211;set @sql = &#8216;DBCC SHRINKDATABASE (N&#8221;&#8217; + @db_name + &#8221;&#8217;, 75)&#8217;<br />
&#8211;exec(@sql)</p>
<p>FETCH NEXT FROM extract INTO @db_name<br />
END</p>
<p>CLOSE extract<br />
DEALLOCATE extract</p>
<p>GO</p>
<p>/****** Object: StoredProcedure [dbo].[usp_BackupAllTransactionLogs] Script Date: 07/31/2009 19:04:58 ******/<br />
SET ANSI_NULLS ON<br />
GO</p>
<p>SET QUOTED_IDENTIFIER ON<br />
GO</p>
<p>CREATE PROCEDURE [dbo].[usp_BackupAllTransactionLogs]<br />
@BackupTarget_FullPathToFolder varchar(4000)<br />
, @UseLitespeed int = 0<br />
as<br />
/*<br />
exec [dbo].[usp_BackupAllTransactionLogs] &#8216;e:\&#8217;,0<br />
*/</p>
<p>set nocount on</p>
<p>declare @err int<br />
declare @sql varchar(256)<br />
declare @db_name varchar(128)<br />
declare @BackupName varchar(255)<br />
declare @copy_cmd varchar(255)</p>
<p>declare @RunDate varchar(255)<br />
set @RunDate = replace(replace(convert(varchar(255), getdate() , 120), &#8216; &#8216;, &#8216;_&#8217;), &#8216;:&#8217;,&#8221;)<br />
&#8211; select @RunDate</p>
<p>&#8211; Make sure our path ends in a &#8216;\&#8217;…<br />
set @BackupTarget_FullPathToFolder = ltrim(rtrim(@BackupTarget_FullPathToFolder))<br />
if right(@BackupTarget_FullPathToFolder, 1) &lt;&gt; &#8216;\&#8217; set @BackupTarget_FullPathToFolder = @BackupTarget_FullPathToFolder + &#8216;\&#8217;</p>
<p>create table #SimpleRecoveryModelDatabases (<br />
dbname varchar(255)<br />
)</p>
<p>&#8211; Edit this as you see fit…<br />
insert into #SimpleRecoveryModelDatabases(dbname) values (&#8216;model&#8217;)<br />
insert into #SimpleRecoveryModelDatabases(dbname) values (&#8216;msdb&#8217;)<br />
insert into #SimpleRecoveryModelDatabases(dbname) values (&#8216;ReportServer&#8217;)<br />
insert into #SimpleRecoveryModelDatabases(dbname) values (&#8216;ReportServerTempDB&#8217;)<br />
insert into #SimpleRecoveryModelDatabases(dbname) values (&#8216;hmail&#8217;)</p>
<p>CREATE TABLE #BackupInProgress (<br />
[SPID] [varchar] (5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,<br />
[HostName] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,<br />
[BlkBy] [varchar] (5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,<br />
[ActiveSeconds] [int] NULL ,<br />
[DBName] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,<br />
[Command] [varchar] (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,<br />
[Status] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,<br />
[BatchStart] [varchar] (8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,<br />
[Now] [varchar] (8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,<br />
[LBDate] [varchar] (8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,<br />
[ProgramName] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,<br />
[Login] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,<br />
[CPUTime] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,<br />
[DiskIO] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL<br />
)</p>
<p>declare extract CURSOR Local FOR</p>
<p>select<br />
[name]<br />
from<br />
sysdatabases<br />
where<br />
version &lt;&gt; 0<br />
and DATABASEPROPERTYEX(name, &#8216;Status&#8217;) = &#8216;ONLINE&#8217;<br />
and DATABASEPROPERTYEX(name, &#8216;IsInStandBy&#8217;) = 0<br />
and [name] not in (select * from #SimpleRecoveryModelDatabases)<br />
and [name] not in (&#8216;tempdb&#8217;,'master&#8217;)<br />
and [name] = &#8216;RCRC&#8217;<br />
order by<br />
[name]</p>
<p>OPEN extract<br />
FETCH NEXT FROM extract<br />
INTO @db_name</p>
<p>WHILE (@@FETCH_STATUS = 0) BEGIN</p>
<p>truncate table #BackupInProgress</p>
<p>insert into #BackupInProgress exec sp_what</p>
<p>if ((select count(1) from #BackupInProgress where DBName = @db_name and Command = &#8216;BACKUP DATABASE&#8217;) = 0) &#8212; is the current db being backed up now?<br />
begin</p>
<p>&#8211; Check on recovery mode…<br />
if @db_name in (select * from #SimpleRecoveryModelDatabases)<br />
begin<br />
set @sql = &#8216;alter database [' + @db_name + '] set recovery simple&#8217;<br />
exec(@sql)<br />
select @err = @@error<br />
if @err &lt;&gt; 0 print ltrim(rtrim(str(@@error)))<br />
end<br />
else<br />
begin<br />
set @sql = &#8216;alter database [' + @db_name + '] set recovery FULL&#8217; &#8212; you can consider BULK LOGGED here as well.<br />
exec(@sql)<br />
select @err = @@error<br />
if @err &lt;&gt; 0 print ltrim(rtrim(str(@@error)))<br />
end</p>
<p>&#8211; Backup the transaction logs…<br />
&#8211; For TEMPDB (and other SIMPLE), truncate the log…<br />
/* START: This is depricated in 2005 and unsupported in 2008, so comment this out if you are using SQL Server 2008 or newer… */<br />
if DATABASEPROPERTYEX(@db_name, &#8216;Recovery&#8217;) = &#8216;SIMPLE&#8217;<br />
begin<br />
set @sql = &#8216;backup log [' + @db_name + '] with truncate_only&#8217;<br />
exec(@sql)<br />
select @err = @@error<br />
if @err &lt;&gt; 0 print ltrim(rtrim(str(@@error)))<br />
end<br />
else<br />
/* END: This is depricated in 2005 and unsupported in 2008, so comment this out if you are using SQL Server 2008 or newer… */<br />
&#8211; For other logging databases, backup the log…<br />
if DATABASEPROPERTYEX(@db_name, &#8216;Recovery&#8217;) &lt;&gt; &#8216;SIMPLE&#8217;<br />
begin</p>
<p>set @BackupName = @BackupTarget_FullPathToFolder + @db_name + &#8216;_log_&#8217; + @RunDate + &#8216;.bak&#8217;</p>
<p>if (@UseLitespeed = 1)<br />
begin<br />
&#8211; LiteSpeed backup…<br />
exec xp_backup_log @database = @db_name, @filename = @BackupName, @init = 1, @logging = 0, @with = &#8216;SKIP&#8217;, @with = &#8216;STATS = 10&#8242;<br />
end<br />
else<br />
begin<br />
&#8211; SQL Server Backup…<br />
set @sql = &#8216;backup log [' + @db_name + '] to disk = &#8221;&#8217;+ @BackupName + &#8221;&#8217; with init&#8217;<br />
exec(@sql)<br />
end</p>
<p>select @err = @@error<br />
if @err &lt;&gt; 0 print ltrim(rtrim(str(@@error)))<br />
end</p>
<p>end</p>
<p>&#8211; Shrink Database<br />
&#8211; As per microsoft, avoid shrinking / regrowing the tempdb<br />
&#8211;set @sql = &#8216;DBCC SHRINKDATABASE (N&#8221;&#8217; + @db_name + &#8221;&#8217;, 75)&#8217;<br />
&#8211;exec(@sql)</p>
<p>FETCH NEXT FROM extract INTO @db_name</p>
<p>END</p>
<p>CLOSE extract<br />
DEALLOCATE extract</p>
<p>drop table #SimpleRecoveryModelDatabases</p>
<p>GO</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://sql.guardianbob.net/?feed=rss2&amp;p=3</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
