導庫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表示源數據實體的名稱