2006-08-24

SQL Server数据库下教你如何做导库SQL

来源: 中国本站网 作者:佚名 评论 0 条
 

导库SQL -- 适用于sql server

在企业信息化建设过程中,数据库实体做为存放企业运营数据的仓库,具有至高重要的地位。

为防止数据丢失,事前预防是很要害的,诸如数据库定期备份、磁盘阵列、集群解决方案等等。

但是一旦发生数据丢失或是损坏的现象,而且不能通过正常的修复手段来处理,则可以通过导库来尝试一下。

国产的软件包括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表示源数据实体的名称


共2页: 上一页 1 [2] 下一页
(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:常用的 MSSQL Server 数据修复命令  
下一篇:SQL Server 2000 数据库分离与附加
    评论加载中…
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号