有几百个外部表(DBF),表结构是相同的,现在想要把他们导入到sqlserver的一张表中.如何实现,用向导导入的话要一个个选择,请问有更简单的方法吗

解决方案 »

  1.   

    如果你熟悉DTS, 可以创建一个DTS包来实现数据导入, 并且把 dts 包中, dbf 文件名用一个全局变量代替, 然后反复执行这个DTS包, 每次执行的时候传入不同的dbf文件名即可.
      

  2.   

    如果你擅长写T-SQL, 则可以写T-SQL导入
    在SQL中访问DBF文件参考下面的(注意DBF文件有两种, 根据你的情况选用)--/* dBase 文件
    select * from 
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase III;DATABASE=C:\'
    ,'select * from [客户资料3.dbf]')--/* FoxPro 数据库
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', --c:\是目录
    'select * from [aa.DBF]') --aa.dbf是文件名
      

  3.   

    上面的语句只能导入一个文件, 要导入一个目录下的所有文件, 可以把上面的语句写成批处理:
    下面是示例(假设dbf文件是 Foxpro 数据库的)DECLARE @Path nvarchar(1000), @sql nvarchar(1000), @tbname sysnameSELECT @Path = 'c:\'   -- dbf 文件所在的目录
    ,@tbname = 'tb'    -- 接收 dbf 文件数据的目的表-- 导入处理
    CREATE TABLE #(fname nvarchar(1000))
    SET @sql = 'DIR ' + @Path + '*.txt'
    INSERT # EXEC master.dbo.xp_cmdshell @sql
    IF @@ROWCOUNT = 0 
    RETURN
    DECLARE tb CURSOR LOCAL
    FOR
    SELECT N'INSERT ' + @tbname + N'
    SELECT * FROM OPENROWSET(''MSDASQL'',
    ''Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=' + @Path + ''',
    ''SELECT * FROM ' + QUOTENAME(fname) + N''')'
    OPEN tb
    FETCH tb INTO @sql
    WHILE @@FETCH_STATUS = 0
    BEGIN
    EXEC(@sql)
    FETCH tb INTO @sql
    END
    CLOSE tb
    DEALLOCATE tb
    DROP TABLE #
      

  4.   

    如果你用的是sql 2005, 那问题还会再简单一些.SQL 2005 的 SSIS 包(DTS的升级产品)中, 支持 for each 的文件循环, 可以直接用该控件遍历某个目录(可以包含子目录)下的所有 dbf 文件, 这样的话, 创建一个 ssis 包就可以实现导入.