Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使用SSIS将多址数据库导入SQL Server_Sql Server_Ms Access_Ssis - Fatal编程技术网

Sql server 如何使用SSIS将多址数据库导入SQL Server

Sql server 如何使用SSIS将多址数据库导入SQL Server,sql-server,ms-access,ssis,Sql Server,Ms Access,Ssis,我有一个包含300多个Access数据库的文件夹(由我无法控制的程序编写)。它们都有相同的结构,只有一张桌子。我正在将数据导入SQLServer(2005)中的一个表中。使用导入向导效果很好,但一次只能使用一个Access db 我一直在寻找一种实现这一点的方法,我想我已经开始在ForEach循环容器中使用数据流任务了。但是,我只看到了一种将Excel文件或平面文件作为源文件的方法 非常感谢您的帮助。对于一次性任务,您可以使用一次性VBA代码 创建一个新数据库,并在该数据库中创建到SQL Ser

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

我一直在寻找一种实现这一点的方法,我想我已经开始在ForEach循环容器中使用数据流任务了。但是,我只看到了一种将Excel文件或平面文件作为源文件的方法


非常感谢您的帮助。

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

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

然后创建一个新的访问查询,如下所示:

插入远程_表()
挑选
从“C:\SourceFolder\db1.mdb”中的表中;
如果源和目标中的字段名称相同,则可以省略

插入远程\u表
挑选*
从“C:\SourceFolder\db1.mdb”中的表中;
在最佳情况下,访问字段值将与SQL Server字段类型兼容。如果没有,则必须使用Access函数将字段值强制转换为与SQL Server兼容的类型

排序后,从Access db文件上载数据的VBA过程可能会很快且简单:

子测试()
Const cstrExtension As String=“mdb”
Const cstrFolder As String=“C:\SourceFolder\”
Dim db作为DAO.database
作为字符串的Dim strDbFile
将暗条纹插入为字符串
strInsert=“插入远程_表()”&vbCrLf&_
“选择”&vbCrLf&_
“从'DB_FILE'中的YourTable;”
Set db=CurrentDb
strDbFile=Dir(cstrFolder&“*.”和cstrExtension)
当Len(strDbFile)>0时执行
db.Execute Replace(strInsert,db_文件_
cstrFolder和strDbFile),dbFailOnError
strDbFile=Dir()
环
Set db=Nothing
端接头

您需要做的是:

1.-在包内创建两个变量,一个称为“current_file”,另一个称为“loading_location”(或您喜欢的名称),这两个变量的作用域都大于包,数据类型字符串,对于current_file,将值保留为空,加载_location时将文件夹的路径与Access数据库一起放置

2.-添加Foreach循环容器,在其中转到集合,选择表达式,并添加新表达式。在property select Directory上,在Expression中选择刚刚创建的加载位置变量。 再次返回集合并在文件中放入:*.mdb

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

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

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

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

现在,我们将对每个Access数据库进行更改

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

数据源=“MyAccessDBFile”;Provider=Microsoft.Jet.OLEDB.4.0

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

“数据源=“+yourCurrentFileVariable+”;提供程序=Microsoft.Jet.OLEDB.4.0;”

你应该得到这样的东西:

“数据源=“+@[User::current_file]+”;提供程序=Microsoft.Jet.OLEDB.4.0;”

为属性“ServerName”添加一个新的表达式,在此表达式中选择当前的_文件变量作为表达式,您应该在表达式字段中得到如下内容:

@[用户::当前_文件]

7.-现在您将在OLE DB源代码中得到一个错误,不要担心,这只是因为当前的_file变量还没有任何值。返回Foreach循环容器中的数据流任务,并将DelayValidation属性设置为true。转到Project->“您的包”属性->调试,并将Run64BitRunteime设置为false


就这样。

这是一项一次性任务。不,我不支持SSIS。我只是认为这可能是一种方法,但我对任何事情都持开放态度。使用ForEach循环容器的方法将是正确的SSIS方法。不管是配置平面文件、Excel还是Access,逻辑都是一样的。ForEach枚举数将弹出一个值,然后将该值用作Access连接管理器ConnectionString属性上表达式的一部分。如果你需要这个完整的答案,请告诉我。我现在不在,但今天晚些时候会尝试一下,谢谢。我在SQL Server中创建了该表,以便字段名和值相同。我已经用导入向导导入了几个Access数据库,所以我知道一切都准备好了。我已经多年没有使用Access了,这也可以通过SQL Server上的存储过程来实现吗?对不起,我没有注意到您评论中的存储过程问题。您可以使用Access db文件作为“链接服务器”来执行类似操作。但300个Access db文件让这看起来令人望而生畏。如果您对我建议的方法不感兴趣,我认为您应该继续使用@billinkc,了解他提供的SSIS解决方案。