SQLSERVER数据库损坏,发生结构性错误,DBCC无法修复时

当数据库损坏,发生结构性等错误,DBCC也无法修改时,但可以select出表数据,可以采用以下方法,将数据迁移。

首先,还原一个最近的备份,即产一个新数据库A2,此时还原的数据库中的数据不是最新的,那么我们就需要把目前最新的数据导入到还原的A2中。

生成批量sql导入语句如下:

--两数据库表结构相同,A数据库数据导入到B数据库,批量生成sql语句
--数据库A1表数据插入到数据库A2表中
   Declare @LS_tablename nvarchar(200),@strsql nvarchar(max),@Column nvarchar(max);
   Declare T_LSCur_table_name Cursor For 
   ---查询出A1中所有存在数据的表
   SELECT o.name  FROM A1.sys.sysindexes i JOIN A1.sys.objects o
     ON i.id=o.object_id WHERE o.type='u' AND i.indid<=1 --and o.name='student'
      and rows>0
Open T_LSCur_table_name
Fetch Next From T_LSCur_table_name Into @LS_tablename
While @@Fetch_Status=0
Begin
        set @strsql='';
        ---表列拼接,过滤掉字段类型timestamp的字段
        set @Column=(select stuff((select ','+convert(varchar,syscolumns.name) from syscolumns,systypes where syscolumns.xusertype=systypes.xusertype and syscolumns.id=object_id(@LS_tablename) and systypes.name<>'timestamp' for xml Path('')),1,1,'') as cell); 
        set @strsql=' truncate table '+@LS_tablename+ char(10)+' GO '+ char(10);   
        set @strsql=@strsql+' SET IDENTITY_INSERT '+@LS_tablename +' ON '+ char(10) +' GO '+ char(10);--关闭表自增标识
        set @strsql=@strsql+' insert into A2.dbo.'+@LS_tablename+'('+@Column+')'+ ' select '+@Column+' from A1.dbo.'+@LS_tablename+ char(10)+' GO '+ char(10);
        set @strsql=@strsql+' SET IDENTITY_INSERT '+@LS_tablename+' OFF' +char(10)+ ' GO '+char(10); --开启
      print @strsql 
       --exec(@strsql) ;
  Fetch Next From T_LSCur_table_name Into @LS_tablename
End
Close T_LSCur_table_name
Deallocate T_LSCur_table_name 

第二种方法,也可以采用数据库管理器自带的导入导出功能

SQLSERVER数据库损坏,发生结构性错误,DBCC无法修复时_第1张图片

 SQLSERVER数据库损坏,发生结构性错误,DBCC无法修复时_第2张图片

 SQLSERVER数据库损坏,发生结构性错误,DBCC无法修复时_第3张图片

勾选要导入数据的表,最后点确定导入完成即可。

这个要注意的是要先取消主键及自增标识,有些字段设置有默认初始值的,都要去检查一下是否有被取消,如果有清除掉了就需要重新设置一下。

最后,在DBCC数据库及表,重建一下索引。

你可能感兴趣的:(SQL,C#,ASP.NET,数据库,sql)