top
Loading...
SQLServer數據庫下教你如何做導庫SQL

導庫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] GoCreate PROCEDURE [sp_ExportDatabase] (    @SourceDB varchar(100)) ----創建存儲過程 sp_ExportDatabaseASBegin      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 Ctbprint 'Import database complete!'    return 0EndGoExec sp_ExportDatabase mytest   ----mytest表示源數據實體的名稱

(t114)

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗