如何在SSIS Excel Source组件中进行INNER JOIN

SELECT [Sheet1$].ID, CLng([Sheet1$].RecordID) AS RecordID, [Sheet1$].col1, [Sheet1$].col2, [Sheet1$].col3, [Sheet1$].col4, [Sheet1$].col5, [Sheet2$].Name FROM [Sheet1$] INNER JOIN [Sheet2$] ON [Sheet1$].RecordID = [Sheet2$].RecordID 

我有一个SSIS Excel源组件中的上述示例SQL命令。 正如在查询中看到的,我在同一工作簿中的两个Excel工作表(Sheet1和Sheet2)上进行内部连接。

在这一点上查询执行得很好,没有任何错误。

但是,我无法join第三张(Sheet3)。 当我尝试在sheet3上进行内连接时,出现以下错误消息。

OLE DBlogging可用。 来源:“Microsoft Access数据库引擎”Hresult:0x80040E14描述:“查询expression式”[Sheet1 $]。中的语法错误(缺less运算符)RecordID INNER JOIN [Sheet3 $] ON [Sheet1 $]。 = [Sheet3 $]。RecordID'

所以我基本上无法做两个或更多的Excel表内连接。 我只能在一个excel表单上进行内部连接。 我使用的语法在SQL Server中工作,所以我想知道它是否应该在SSIS Excel源SQL命令以及它似乎是使用Microsoft Access数据库引擎工作。

下面是正在生成上述错误的第二个连接的查询:

  SELECT [Sheet1$].ID, CLng([Shee1$].RecordID) AS RecordID, [Sheet1$].col1, [Sheet1$].col2, [Sheet1$].col3, [Sheet1$].col4, [Sheet1$].col5, [Sheet2$].Name FROM [Sheet1$] INNER JOIN [Sheet2$] ON [Sheet1$].RecordID = [Sheet2$].RecordID INNER JOIN [Sheet3$] ON [Sheet1$].RecordID = [Sheet3$].RecordID 

好吧,我做错了。 由SSIS Excel Source组件使用的Microsoft Access数据库引擎处理连接与SQL Server不同。

显然,除了第一个,其中n是连接在一起的表的数量之外,在每个新连接子句开始之前,您需要在from子句和一个右括号之后有n-2个左括号。

原因是Access的连接语法一次只能连接两个表,所以如果你需要连接两个以上的表,你需要用括号括起来。

从Access-SQL引用:内部join多个表

并确认在http://office.microsoft.com/en-001/access-help/inner-join-operation-HA001231487.aspx

所以下面的查询现在可以工作

 SELECT [Sheet1$].ID, CLng([Shee1$].RecordID) AS RecordID, [Sheet1$].col1, [Sheet1$].col2, [Sheet1$].col3, [Sheet1$].col4, [Sheet1$].col5, [Sheet2$].Name FROM (([Sheet1$]) INNER JOIN [Sheet2$] ON [Sheet1$].RecordID = [Sheet2$].RecordID) INNER JOIN [Sheet3$] ON [Sheet1$].RecordID = [Sheet3$].RecordID 

让我们尝试作弊:

 SELECT CLng(x.RecordID) AS RecordID, x.col1, x.col2, x.col3, x.col4, x.col5, x.Name FROM ( SELECT [Sheet1$].RecordID, [Sheet1$].col1, [Sheet1$].col2, [Sheet1$].col3, [Sheet1$].col4, [Sheet1$].col5, [Sheet2$].Name FROM [Sheet1$] INNER JOIN [Sheet2$] ON [Sheet1$].RecordID = [Sheet2$].RecordID ) as x INNER JOIN [Sheet3$] ON x.RecordID = [Sheet3$].RecordID