Microsoft . 技术之路...

—— 专注于微软技术, 分享是快乐的源泉......
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SQLServer中如何做导库操作?

Posted on 2007-07-02 11:46  赣江源  阅读(353)  评论(0编辑  收藏  举报

        在企业信息化建设过程中,数据库实体做为存放企业运营数据的仓库,具有至高重要的地位。为防止数据丢失,事前预防是很关键的,诸如数据库定期备份、磁盘阵列、集群解决方案等等。 但是一旦发生数据丢失或是损坏的现象,而且不能通过正常的修复手段来处理,则可以通过导库来尝试一下。
        国产的软件包括k/3,u8 等等,都有类似管理数据库的工具,管理工具中提供新建数据库的功能,新建的同类(指管理工具中提供的类别)数据库实体(国产软件通常称之为“账套”)有相同的表结构。因此,如果账套损坏,且无法修复的,可以新建一同类型的账套实体,通过下面的导库语句把被损坏的账套的数据导入新建账套中。
        下面的语句提供了一个比sql server DTS导入导出更加灵活的工具。不过需要大家仔细理解才能运用的得心应手哈!!

----该存储过程建立在新帐套中,并在新账套中执行

if Exists(select * from sysobjects where
 name
=N'sp_ExportDatabase' And Xtype='P')
    
Drop PROCEDURE [sp_ExportDatabase] 
Go

Create PROCEDURE [sp_ExportDatabase] (
    
@SourceDB varchar(100)
----创建存储过程 sp_ExportDatabase
AS
Begin
      
Set NoCount On

    
Declare @Utb sysname     ------用户表名
    Declare @ColName sysname   ------列名
    Declare @tid int       ------用户表的ID
    Declare @sql nvarchar(3000)------存放拼出的sql
    Declare @len int

    
--定义游标取回用户建立的表

    
sELECT @SourceDB=@SourceDB+'.'
    
Declare Ctb Cursor For 
    
Select name,id From sysobjects 
 
Where xtype ='U'

----如果在导库过程中因某表存在错误而导致导库过程停止 ,
  则可以尝试修复此表。
      ----如果此表不是很重要、或是此表无法修复,则可以在此加入条件

 And name in (tablename1,tablename2,……) 
    
------tablename1,tablename2 表示不能修复的表的名字
    Order by name

    
Open Ctb
    
Fetch Ctb Into @Utb,@tid
    
While (@@FETCH_STATUS=0)
    
Begin   ----禁用当前数据库中所有表的约束、触发器
        Select @Utb='Dbo.'+@Utb
 
Select @SQL='Alter Table '+@Utb+' Disable Trigger All; '+ ' 
  ALTER TABLE 
'+ @Utb +' 
 NOCHECK CONSTRAINT All; 
'
        
exec ( @SQL)
        
Fetch Ctb Into @Utb,@tid
    
End   
    
close ctb

    
Open Ctb
        
Fetch Ctb Into @Utb,@tid
        
While (@@FETCH_STATUS=0)
        
Begin
          
Select @Utb='Dbo.'+@Utb
                
          
exec (' Delete ' + @Utb)
              
              
Set @sql=''
              
Declare Clu Cursor For Select name From 
     syscolumns 
Where id=@tid 
And iscomputed=0 and xtype<>189
              
Open Clu
              
Fetch Clu Into @ColName
              
While (@@FETCH_STATUS=0)
              
Begin     ----把列名以逗号隔开,拼成字符串               
                  Set @sql=@sql+ @ColName + ',' 
                  
Fetch Clu Into @ColName
              
End
              
Close Clu
              
DeAllocate Clu

              
----构造字符串         
              Set @len=Len(@sql)
              
If @len>0 
              
Begin   ----把源数据库中的表导入到当前数据库中
                  Select @sql=left(@sql,@len-1)
 
Set @sql='Insert Into '+ @Utb + ' ('+@sql+''+' Select '
         
+@sql+' From ' + @SourceDB+ @Utb
                  
print 'Importing Table : ' +@utb+''
                  
If Exists (Select name From syscolumns 
          
Where id=@tid and status=0x80)
                      
begin
      
Select @SQl='Set IDENTITY_INSERT '+ @Utb + ' ON' 
           
+ ' Delete ' + @Utb+' '+@sql
                      
print @sql
                      
end
                  
Else
                      
Select @SQl=@sql
        
                  
Exec ( @sql)

 
If Exists (Select name From syscolumns Where id=@tid 
   
and status=0x80)
                      
Exec'Set IDENTITY_INSERT '+ @Utb + ' Off')
                  
print 'Importing Table : ' +@utb+' complete'
              
End
                  
              
Fetch Next From Ctb Into @Utb,@tid
        
End
    
Close Ctb


    
Open Ctb
    
Fetch Ctb Into @Utb,@tid
    
While (@@FETCH_STATUS=0)
    
Begin   ----启用当前数据库中所有表的约束、触发器
        Select @Utb='Dbo.'+@Utb
 
select @sql='Alter Table '+@Utb+' Enable Trigger All
 
'+ ' ALTER TABLE '
     
+ @Utb +' CHECK CONSTRAINT All '
        
Exec sp_executesql @sql
        
Fetch Ctb Into @Utb,@tid
    
End
    
close ctb

    
DeAllocate Ctb

print 'Import database complete!'
    
return 0
End
Go

Exec sp_ExportDatabase mytest   ----mytest表示源数据实体的名称