如何使用 SSIS 将多个 Access 数据库导入 SQL Server

Posted

技术标签:

【中文标题】如何使用 SSIS 将多个 Access 数据库导入 SQL Server【英文标题】:How to import multiple Access databases into SQL Server using SSIS 【发布时间】:2013-01-21 17:30:59 【问题描述】:

我有一个包含 300 多个 Access 数据库的文件夹(由我无法控制的程序编写)。它们都具有相同的结构,只是一个表。我正在将数据导入 SQL Server (2005) 中的表中。使用导入向导效果很好,但一次只能使用一个 Access db。

我已经搜索并搜索了一种方法来执行此操作,并且我认为我正在使用 ForEach 循环容器中的数据流任务进行某些事情。但是,我只看到了一种使用 Excel 文件或平面文件作为源的方法。

非常感谢任何帮助。

【问题讨论】:

这是一项一次性任务。不,我不致力于 SSIS。我只是认为这可能是要走的路,但我对任何事情都持开放态度。 您使用 ForEach 循环容器的方法是正确的 SSIS 方法。不管是配置平面文件,Excel还是Access都无所谓,逻辑都是一样的。 ForEach 枚举器将弹出一个值,然后将其用作 Access Connection Manager 的 ConnectionString 属性上的表达式的一部分。让我知道您是否需要将其扩展为完整的答案。 【参考方案1】:

对于一次性任务,您可以使用一次性 VBA 代码。

创建一个新数据库,并在该数据库中创建一个指向您的 SQL Server 表的 ODBC 链接。

然后新建一个类似这样的 Access 查询:

INSERT INTO remote_table (<field list>)
SELECT <field list>
FROM YourTable In 'C:\SourceFolder\db1.mdb';

如果源和目标中的字段名称相同,则可以省略&lt;field list&gt;

INSERT INTO remote_table
SELECT *
FROM YourTable In 'C:\SourceFolder\db1.mdb';

在最好的情况下,Access 字段值将与 SQL Server 字段类型兼容。如果不是,则必须使用 Access 函数将字段值转换为 SQL Server 兼容类型。

完成排序后,从 Access db 文件上传数据的 VBA 过程会变得快速而简单:

Sub Test()
Const cstrExtension As String = "mdb"
Const cstrFolder As String = "C:\SourceFolder\"
Dim db As DAO.database
Dim strDbFile As String
Dim strInsert As String

strInsert = "INSERT INTO remote_table (<field list>)" & vbCrLf & _
    "SELECT <field list>" & vbCrLf & _
    "FROM YourTable In 'DB_FILE';"
Set db = CurrentDb
strDbFile = Dir(cstrFolder & "*." & cstrExtension)
Do While Len(strDbFile) > 0
    db.Execute Replace(strInsert, DB_FILE, _
        cstrFolder & strDbFile), dbFailOnError
    strDbFile = Dir()
Loop
Set db = Nothing
End Sub

【讨论】:

我现在不在,但今天晚些时候会试一试,谢谢。我在 SQL Server 中创建了表,以便字段名称和值相同。我已经使用导入向导导入了几个 Access 数据库,所以我知道一切准备就绪。好多年没用过Access了,能不能用SQL Server上的存储过程来实现? 对不起,我没有注意到您评论中的存储过程问题。您可能可以使用 Access db 文件作为“链接服务器”来执行类似的操作。但是 300 个 Access db 文件让人望而生畏。如果您对我建议的方法不感兴趣,我认为您应该跟进@billinkc RE 他提供的 SSIS 解决方案。【参考方案2】:

你需要做的是:

1.- 在包中创建 2 个变量,一个名为“current_file”,另一个名为“loading_location”(或您喜欢的名称),两者都具有包的范围,数据类型字符串,对于 current_file,保持值为空,在 loading_location 上将您的文件夹的路径放入 Access 数据库中。

2.- 添加一个 Foreach 循环容器,在其中转到 Collection,选择表达式,然后添加一个新表达式。在属性上选择目录,然后在表达式中选择刚刚创建的 loading_location 变量。 再次返回集合并在文件中输入:*.mdb

保持所有其他选项相同。然后转到变量映射并在变量中选择 current_file 变量。

3.- 创建一个新的 OLE DB 连接。在提供程序上选择“Microsoft Jet 4.0 OLE DB 提供程序”,在数据库文件名上选择您的任何访问数据库(稍后会更改,不要担心)。

4.- 在 Foreach 循环容器内创建一个数据流任务,在该数据流任务内添加一个 OLE DB 源。打开 OLE DB 源,在连接管理器中,选择刚刚创建的连接,在数据访问模式下选择“表或视图”,然后为 DB 选择表。

5.- 添加一个 OLE DB 目标,为目标数据库选择相应的连接,然后选择要放置 Access 数据库数据的表。

现在我们将对其进行更改以通过每个 Access 数据库..

6.- 选择您为 Access DB 创建的连接,转到“属性”窗口并记下 ConnectionString 值,在我的例子中是:

Data Source="MyAccessDBFile";Provider=Microsoft.Jet.OLEDB.4.0;

根据对数据库的权限,您可能有额外的东西。 现在转到 Expression 属性,展开它,我们将添加 2 个表达式。一个过属性“ConnectionString”,并在表达式中放

"Data Source="+yourCurrentFileVariable+";Provider=Microsoft.Jet.OLEDB.4.0;"

你应该得到这样的东西:

"Data Source="+ @[User::current_file]+";Provider=Microsoft.Jet.OLEDB.4.0;"

为属性“ServerName”添加一个新表达式,在此选择 current_file 变量作为表达式,您应该在表达式字段中得到类似的内容:

@[用户::current_file]

7.- 现在您将在 OLE DB 源中得到一个错误,不要担心这只是因为 current_file 变量还没有任何值。返回到 Foreach 循环容器中的数据流任务,并将 DelayValidation 属性设置为 true。进入 Project->"Your Package" Properties->Debugging,将 Run64BitRunteime 设置为 false。

就是这样。

【讨论】:

以上是关于如何使用 SSIS 将多个 Access 数据库导入 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SSIS 将多个表中的数据插入到多个表中?

使用 SSIS 将数据加载到 SQL Server 中的多个表

使用 SSIS 2008 批量插入多个 XML 文件

SSIS - 使用 SSIS 将多个文件 .txt 读取到 SQL

SSIS 多个条件拆分

如何遍历 Excel 文件并使用 SSIS 包将它们加载到数据库中?