RT 从MSSQL数据库向Access导入数据
   ADOConnection1,ADOQuery1 连接MSSQL数据库进行表数据查询,ADOConnection2,ADOQuery2 连接Access数据库进行数据插入.
  MSSQL表中数据在11万+,全部导入Access,但两表字段并不完全相同或变化导入,(如:id+100 as new_id)
 try
   .. //Query1 数据查询
   ADOQuery1.Open;
    while not eof do
     begin
      .. //Query2数据插入
      ADOQuery2.Prepared;
      ADOQuery2.ExecSQL;
      ADOQuery1.Next;
    end;
 except
 end;
为了提高速度,已经把事务取消了,ADOQuery的CacheSize设为1000,Lock Type设为ltBatchOptimistic 但速度还是很慢,还要如何才能提高速度?
象这种批量导入的有没有其他的方法进行?
很急,各位大哥大姐的救下啊,不胜感激,在线等.....  

解决方案 »

  1.   

    -- To allow advanced options to be changed.
    EXEC sp_configure 'show advanced options', 1
    GO
    -- To update the currently configured value for advanced options.
    RECONFIGURE
    GO
    -- To enable the feature.
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    -- To update the currently configured value for this feature.
    RECONFIGURE
    GOexec   master..xp_cmdshell   'bcp   "select   *   from   sysobjects"   queryout   d:\a.mdb   -c   -q   -Usa   -Ppwd'
      

  2.   

    /*************导出到Access********************/  
    insert  into  openrowset('Microsoft.Jet.OLEDB.4.0',    
         'x:\A.mdb';'admin';'',A表)  select  *  from  数据库名..B表  
     
    /*************导入Access********************/  
    insert  into  B表  selet  *  from  openrowset('Microsoft.Jet.OLEDB.4.0',    
         'x:\A.mdb';'admin';'',A表)  
     
      

  3.   

    把任务交给MS SQL SERVER,在query里嵌入T-SQL的批导出语句/*************导出到Access********************/
    insert into openrowset('Microsoft.Jet.OLEDB.4.0', 
    'x:\A.mdb';'admin';'',A表) select * from 数据库名..B表这样
     try
       .. //Query1 数据查询
       ADOQuery1.Open;
        while not eof do
         begin
          .. //Query2数据插入
          ADOQuery2.Prepared;
          ADOQuery2.ExecSQL;
          ADOQuery1.Next;
        end;
     except
     end; 必然很慢的当然你也可以使用TBatchMove构建实现
      

  4.   

    谢谢两位:
     不过两表字段并不完全相同或变化导入,(如:id+100 as new_id) 具体要怎么写哦???
      

  5.   

    selet  *  from  openrowset('Microsoft.Jet.OLEDB.4.0',    
         'x:\A.mdb';'admin';'',A表)  
    可以把*写为各字段和计算公式
      

  6.   

    什么select into ... insert into,然后嵌套查询什么的,总可以搞定,实在搞不定的,如字符串格式化处理等,用存储函数搞定,加上openrowset,总可以直接搞到Access中的同样连接Access,用Select into ... From Table In [ODBC][...]连SQLServer,同样能够导进去,总之比你那种速度快很多数据导入的思路一般是尽可能快速导入,需要什么处理,导入后再说(鉴于Access比SQLServer弱,建议导出前处理好,然后导出到Access)
      

  7.   


    /*************导出到Access********************/
    insert into openrowset('Microsoft.Jet.OLEDB.4.0', 
    'x:\A.mdb';'admin';'',A表) select * from 数据库名..B表是这么写吗?语法不对啊?我从来没写过这种语句....是我太苯了?急死我了..insert into openrowset('Microsoft.Jet.OLEDB.4.0',
    'X:\A.mdb';'admin';'',A表(id,name,user,no)) select id+10 as id,names,user,p_no from vv.dbo.B表
      

  8.   

    那你试试在Access中执行这个
    Select * Into A表 From B表 IN [ODBC][ODBC;Driver=SQL Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=vv;]
      

  9.   


    insert into openrowset('Microsoft.Jet.OLEDB.4.0','D:\b.mdb';'admin';'',dep(serial,name))
     select serial,name from vv.dbo.deps服务器: 消息 170,级别 15,状态 1,行 1
    Line 1: Incorrect syntax near '('.到底是错在哪里啊?