我需要具有Lookup Transformation Task,其中Connection将是Excel Source。但SSIS允许仅将OLEDB连接设置为连接。
是否有可能将Excel文件用作查找转换的连接?
答案 0 :(得分:10)
合并排序是一个选项,但如果您真的想使用Excel作为SSIS查找任务的源,则可以执行此操作。
正如您已正确识别的那样,您无法在Lookup任务中使用Excel Connection Manager,它只接受OLE DB连接管理器。然后,诀窍是使用带有Excel电子表格的OLE DB连接管理器。
对于这个例子,我有一个带有州代码及其全名的电子表格,我的源数据只有流经的缩写。本演练将针对Excel连接查找任务以检索这些值。
记住这些警告:查找区分大小写,无论源数据库(或本例中的文件)是否区分大小写。 Excel字符串总是被解释为unicode / nvarchar。
给出一个位于C:\ tmp \ LookupReference.xlsx的简单文件,如下所示
我们必须首先建立一个OLE DB连接管理器。而不是默认的“本机OLE DB \ SQL Server本机客户端10.0”更改为“本机OLE DB \ Microsoft Office 12.0访问数据库引擎OLE DB提供程序”。在服务器或文件名中,找到源文件。此时单击“测试连接”将导致错误。
这就是“魔术”。单击“全部”选项卡并滚动到顶部。在扩展属性中,添加指示的字符串“Excel 12.0; HDR = YES; IMEX = 1;”这告诉提供者我们将使用带有标题行的Excel 12.0(.xlsx格式),IMEX 1告诉驱动程序将存在混合数据。
你的包现在看起来像这样。具有扩展属性的连接管理器,并假定存在预先存在的数据流
为简化问题,我有一个脚本源,它使用状态代码MO,KS和NE生成3行数据,并将它们发送到管道。您的来源显然会有所不同,但概念将保持不变。注释中提供的示例代码。
在查找转换中,您需要针对电子表格编写查询。它类似于普通的数据库查询,除非你的表是Sheet1$
,除非你有一个命名范围,你的表将是MyRange
注意引用工作表时需要$。使用上面的示例电子表格,我的查询将是
SELECT
S.StateCode
, S.StateName
FROM
`Sheet1$` S
我将脚本任务列StateCode映射到引用查询的StateCode列,并检查StateName字段,因为我想将其添加到我的数据流中。
我在查找任务之后放置了一个数据查看器,以验证我的查找是否有效
一切正常,我们都很开心。
如果您使用的是.xls文件,则需要进行以下更改。 - 在您的连接管理器中,而不是Office 12提供程序,选择“本机OLE DB \ Microsoft Jet 4.0 OLE DB提供程序” - 扩展属性变为“EXCEL 8.0; HDR =是; IMEX = 1;”
在Using Excel in an SSIS lookup transformation发布此博客。您还可以使用缓存连接管理器在SSIS 2008 +
中使用任何源进行查找答案 1 :(得分:0)
我自己找到了答案:) 我可以使用Merge Join with Excel DataSource。
答案 2 :(得分:0)
使用Merge Join和Excel DataSource澄清解决方案:
您可以使用Excel数据源作为Merge Join transformation的输入。
需要考虑的一些要求: