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

发表于:2007-05-26来源:作者:点击数: 标签:
导库 SQL -- 适用于sql server 在企业信息化建设过程中, 数据库 实体做为存放企业运营数据的仓库,具有至高重要的地位。 为防止数据丢失,事前预防是很关键的,诸如数据库定期备份、磁盘阵列、集群 解决方案 等等。 但是一旦发生数据丢失或是损坏的现象,而

导库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表示源数据实体的名称

原文转自:http://www.ltesting.net