• After reading your recent 'Importance of Validating Backups' and now this article on DBCC CHECKSUM, I'm very curious to know how much database corruption is really encountered in the real world. I deal with a few client production databases and in the course of 10 years or so I have never run into this corruption issue - thank heaven.

    So to all the SQL Server Central community out there, to whom has this ever really happend!?

    And again, after reading your recent 'Importance of Validating Backups' I decided to get my hands a little dirty and automate this DBCC CHECKSUM on a production database. It's not so simpe. But here is my solution. It consistes of check1.sql which generates check.log which is read by check2.sql and sends an email when something went wrong. Has anyone done anything to automate DBCC CHECKSUM that's a bit more clever?

    -- does a dbcc checkdb on a database

    -- this should be run via sqlcmd with -o parameter sending ouput to file check.log;

    -- this file then gets read by check2.sql

    declare @errnum int

    declare @errdesc varchar(255)

    set @errnum=0

    set @errdesc=''

    begin try

    dbcc checkdb('MYDATABASE')

    set @errnum=@@error

    set @errdesc=error_message()

    end try

    begin catch

    set @errnum=@@error

    set @errdesc=error_message()

    end catch

    if @errnum <> 0 begin

    print 'CHECKDB ERROR: ' + convert(varchar,@errnum) + ' ' + @errdesc

    end

    -- loads check.log generated by check1.sql into a table and

    -- checks if there are errors

    set nocount on

    -- U = table V = view P = stored procedure FN = scalar function TF = table-valued function

    if object_id('tempdb..#sqlcmdlog','U') is not null drop table #sqlcmdlog

    create table #sqlcmdlog(line varchar(8000))

    -- load log file into a one-column table

    bulk insert #sqlcmdlog

    from 'c:\temp\check.log'

    with (rowterminator = '')

    go

    -- check if there were errors

    declare @count1 int

    declare @count2 int

    select @count1=count(*)

    from #sqlcmdlog

    where line like 'CHECKDB found 0 allocation errors and 0 consistency errors%'

    select @count2=count(*)

    from #sqlcmdlog

    where line like 'CHECKDB ERRORS%'

    if @count1<>1 or @count2>0 begin

    -- you should send an email here with file check.log as an attachment

    select line

    from #sqlcmdlog

    where line like 'CHECKDB found % allocation errors and % consistency errors%'

    or line like 'CHECKDB ERROR%'

    end

    The rownterminator value doesn't seem to appear. It should be a backslash followed by the letter 'n'.