2009-05-22 165 views
4

我正在编写一个计划作业来模拟SQL Express的SQL Server维护计划。 (我必须这样做,因为SQL Express不存在SQL代理和相关工具)我可以从.NET运行DBCC CHECKDB吗?

其中一个步骤是执行数据库完整性检查。这样做的TSQL是:

DBCC CHECKDB(N'Northwind') WITH NO_INFOMSGS 

我怎么知道,如果这个命令的执行过程中发生错误,将它抛出一个异常使用ADO.NET时或我将不得不解析文本输出的命令(如果是这样,我在输出中寻找什么)

这很难测试,因为我手边没有损坏的数据库。

回答

2

您可以使用TABLERESULTS选项与CHECKDBDBCC CHECKDB WITH TABLERESULTS)。 这将给你一个列如Error,Level,State,MessageText(其中许多其他)的记录集。

该记录集的Level列(严重级别)应足以确定是否有任何错误。

MS表示级别11到16是“由用户生成的,并且可以由用户纠正”。所以我想说17以上的任何内容都应该意味着:停止进行备份(以避免覆盖损坏的备份),尽可能使系统脱机,并立即通知操作员。

等级11至16也应该向运营商报告(通过普通电子邮件或其他方式),以便他可以在必要时进行检查。 (我不知道如果CHECKDB永远不会通过16与报告水平11错误虽然具有代码在那里将错误/可能通知操作虽然不会受到伤害。)

注意:如果你结合TABLERESULTSNO_INFOMSGS,如果CHECKDB没有发现任何错误,你将不是得到任何记录集,结果,甚至没有一个没有行。

NOTE2:在某些情况下,CHECKDB将失败,并显示错误代码。到目前为止,我只看到触发这个错误,它看起来是这样的:

Msg 211, Level 23, State 51, Line 3 
Possible schema corruption. Run DBCC CHECKCATALOG. 
Msg 0, Level 20, State 0, Line 0 
A severe error occurred on the current command. The results, if any, should be discarded. 

我不使用ADO.NET不多,但我认为ADO.NET会抛出一个异常反应。 另外,由于这是严重性大于等于20的错误,所以会导致客户端连接关闭。我想运行。如果命令失败,则会出现问题(可能是错误的)。如果没有,继续循环遍历结果集,并查找任何严重性级别> = 17。如果发现其中一个,那么可能存在某种严重问题。