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

时间:2013-01-21 17:31:00

标签: sql-server ms-access ssis

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

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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

然后创建一个类似于此的新Access查询:

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

如果字段在源和目标中的名称相同,则可以省略<field list>

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

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

一旦排序完毕,从Access数据库文件上传数据的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

答案 1 :(得分:1)

您需要做的是:

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

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

保持所有其他选项不变。然后转到Variable Mappings并在Variable中选择current_file变量。

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

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

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

现在我们将对此进行更改以遍历每个Access数据库..

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

Data Source =“MyAccessDBFile”; Provider = Microsoft.Jet.OLEDB.4.0;

根据对DB的许可,您可能还有其他内容。 现在转到Expression属性,展开它,我们将添加2个表达式。一个在属性“ConnectionString”上,在Expression put中

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

你应该得到这样的东西:

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

为属性“ServerName”添加一个新表达式,在这一个中选择current_file变量作为Expression,你应该在表达式字段中得到这样的东西:

@ [用户:: current_file]

image

7.-现在您将在OLE DB Source中收到错误,不要担心它只是因为current_file变量还没有任何值。返回Foreach循环容器中的数据流任务,并将DelayValidation属性设置为true。转到Project-&gt;“Your Package”属性 - &gt;调试,并将Run64BitRunteime设置为false。

image

就是这样。