科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道SQL Server数据库下教你如何做导库SQL(2)

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

企业信息化建设过程中,数据库实体做为存放企业运营数据的仓库,具有至高重要的地位。

作者:lao_yang 来源:赛迪网IT博客 2007年9月13日

关键字: 导库SQL SQL Server SQL Server 各版本 数据库

  • 评论
  • 分享微博
  • 分享邮件
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表示源数据实体的名称
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章