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

时间:2014-05-13 08:43:21

标签: sql sql-server excel ssis

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 Source组件中有上面的示例SQL命令。如该查询所示,我在同一工作簿中的两个Excel工作表(Sheet1和Sheet2)上进行内部连接。

此时查询执行良好,没有任何错误。

但是,我无法加入第3张(Sheet3)。当我尝试在sheet3上内部联接时,我收到以下错误消息。

  

OLE DB记录可用。来源:" Microsoft Access数据库引擎" Hresult:0x80040E14描述:"查询表达式中的语法错误(缺少运算符)' [Sheet1 $]。RecordID = [Sheet2 $]。ReportID   INNER JOIN [Sheet3 $] ON   [Sheet1 $]。RecordID = [Sheet3 $] .RadidID'

所以我基本上无法在两个或多个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

2 个答案:

答案 0 :(得分:2)

好吧,我这样做是错误的。 SSIS Excel Source组件使用的Microsoft访问数据库引擎处理连接的方式与SQL Server不同。

  

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

     

原因是Access的连接语法仅支持连接两个   一次只能表,所以如果你需要加入两个以上的表   将额外的括号括在括号中。

引自Access-SQL: Inner Join with multiple tables

并在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

答案 1 :(得分:0)

让我们试着作弊:

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