程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server數據庫下教你如何做導庫SQL

SQL Server數據庫下教你如何做導庫SQL

編輯:關於SqlServer

導庫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表示源數據實體的名稱
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved