SQL Server数据库已损坏表的查找和修复
表结构损坏,表现方式是软件突然发生“莫名其妙”的问题:
如:如酒店系统的突然不能开房,或不能结账,或不能夜审,或不能查看某一个报表。反正用到某个表的某个功能,就不能操作。
但其他功能一切正常,而且数据库也没有置疑。
过去在ERP管理系统开发的这些年中,处理过几次这种情况。这种问题,单从软件上,很难找到原因。后面几经折腾,才找到原因:
原来是Sqlserver数据库中某一个或几个表损坏。
一般是因为断电、或前台人员强行关机、强行关闭软件(特别是当管理软件正在进行夜审、结算等大量的数据运算时)。
现把处理此情况的方法总结如下,希望对大家有用。
注意:下文中,ZPT_HOTEL_JYB是我所用的数据库名称,应用中,记得替换为实际的数据库名称:
第一步:检查并修复数据库,并找出哪个表损坏。
use master
go
---检查数据库错误并修复
DBCC CHECKDB ('ZPT_HOTEL_JYB')
go
运行结果如上图。如有表结构损坏,损坏的表名会在“消息”页以红色的方式显示出来。

第二步:修复损坏的表。
根据第一步检查得知损坏的表名(有可能是一个或多个),使用DBCC CHECKTABLE检查和修复表,SQL语句如下(注意:损坏的表名1,损坏的表名2是一个代名称,请替换为实际损坏的表名):
Use master
go
exec sp_dboption 'ZPT_HOTEL_JYB', 'single user', 'true' --启用单用户
go
use ZPT_HOTEL_JYB
go
--修复SQLSERVER数据库的系统表
dbcc checktable('sysobjects',repair_allow_data_loss)
go
-------开始 修复业务表 -----
dbcc checktable('损坏的表名1',repair_allow_data_loss)
dbcc checktable('损坏的表名2',repair_allow_data_loss)
-------开始 修复业务表 -----
go
--恢复原样启用多用户
Use master
go
exec sp_dboption 'ZPT_HOTEL_JYB', 'single user', 'false' --启用多用户
go

第三步:再次测试和修复数据库
使用DBCC CHECKDB来进行修复数据库。SQL语名如下:
use master
go
---检查数据库错误并修复
DBCC CHECKDB ('ZPT_HOTEL_JYB')
go

至此,损坏的表修复成功。
附:特殊情况处理
如果损伤太严重,无法用SQL语名修复。
处理方法一:
把原来的表改名,然后,建立一个同名且表结构完全相同的表,然后从改名后的原表,把数据导入到新建的空表中。
处理方法二:
把原来的表改名,然后,建立一个同名且表结构完全相同的表,然后从最近备份的数据库中,把数据导入到新建的空表中(如此表是业务表,这样有可能会损失一部份最近的数据)。