Excel源作为查找转换连接

时间:2011-10-31 12:13:42

标签: sql-server ssis

我需要具有Lookup Transformation Task,其中Connection将是Excel Source。但SSIS允许仅将OLEDB连接设置为连接。

是否有可能将Excel文件用作查找转换的连接?

3 个答案:

答案 0 :(得分:10)

合并排序是一个选项,但如果您真的想使用Excel作为SSIS查找任务的源,则可以执行此操作。

正如您已正确识别的那样,您无法在Lookup任务中使用Excel Connection Manager,它只接受OLE DB连接管理器。然后,诀窍是使用带有Excel电子表格的OLE DB连接管理器。

对于这个例子,我有一个带有州代码及其全名的电子表格,我的源数据只有流经的缩写。本演练将针对Excel连接查找任务以检索这些值。

记住这些警告:查找区分大小写,无论源数据库(或本例中的文件)是否区分大小写。 Excel字符串总是被解释为unicode / nvarchar。

源数据

给出一个位于C:\ tmp \ LookupReference.xlsx的简单文件,如下所示 Simple key value pairs in Excel

连接管理器

我们必须首先建立一个OLE DB连接管理器。而不是默认的“本机OLE DB \ SQL Server本机客户端10.0”更改为“本机OLE DB \ Microsoft Office 12.0访问数据库引擎OLE DB提供程序”。在服务器或文件名中,找到源文件。此时单击“测试连接”将导致错误。

OLE DB Connection Manager Connection Tab

这就是“魔术”。单击“全部”选项卡并滚动到顶部。在扩展属性中,添加指示的字符串“Excel 12.0; HDR = YES; IMEX = 1;”这告诉提供者我们将使用带有标题行的Excel 12.0(.xlsx格式),IMEX 1告诉驱动程序将存在混合数据。

OLE DB Connection Manager All Tab

你的包现在看起来像这样。具有扩展属性的连接管理器,并假定存在预先存在的数据流

Control Flow

数据流

为简化问题,我有一个脚本源,它使用状态代码MO,KS和NE生成3行数据,并将它们发送到管道。您的来源显然会有所不同,但概念将保持不变。注释中提供的示例代码。

在查找转换中,您需要针对电子表格编写查询。它类似于普通的数据库查询,除非你的表是Sheet1$,除非你有一个命名范围,你的表将是MyRange注意引用工作表时需要$。使用上面的示例电子表格,我的查询将是

SELECT
    S.StateCode
,   S.StateName
FROM 
    `Sheet1$` S

我将脚本任务列StateCode映射到引用查询的StateCode列,并检查StateName字段,因为我想将其添加到我的数据流中。

Data Flow

我在查找任务之后放置了一个数据查看器,以验证我的查找是否有效

Data Viewer

一切正常,我们都很开心。

旧Excel

如果您使用的是.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的输入。

需要考虑的一些要求:

  • 确保已加入的列具有匹配的元数据
  • 我在设置连接时遇到排序顺序问题。您可能希望对来自源的数据进行排序转换。