導庫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
※以上資訊由網路資料整理而成,若有遺誤概以來源為準,本站不負任何相關責任。
※如果您認為網站上資訊侵犯了您的版權,請告訴我們
按這裡,我們將即時將您的版權資料移除。