Excel VBA ADO SQL - From子句中的语法错误

时间:2016-04-17 08:25:17

标签: sql vba ado

VBA ADO中的以下SQL给出了“From子句中的语法错误”错误。

Sub RunSQL2()

    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim strFile As String
    Dim strCon As String
    Dim strSQL As String
    Dim ws As Worksheet
    Dim strRangeAddress As String
    Dim dataRange As Range

    strFile = ThisWorkbook.Path & "\" & ThisWorkbook.Name
    strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
        & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")

    cn.Open strCon

    Set ws = ThisWorkbook.Sheets("mydata")
    strRangeAddress = ActiveSheet.Name & "$" & ws.Range("A1:C30020").Address(False, False)

        strSQL = strSQL & " (select s.* from "
strSQL = strSQL & " (select t.*, row_number() over (partition by child_level order by child_index,child_level) [rownum] from [" & strRangeAddress & "] t) s "
strSQL = strSQL & " where [rownum] = 1) u "
strSQL = strSQL & " join (select t2.*, 1 as  [rownum] from [" & strRangeAddress & "] t2) v "
strSQL = strSQL & " on (v.parent_level = u.child_level and v.[rownum] = u.[rownum]) "
strSQL = strSQL & " union select  w.child_index,w.child_level,w.child_level,w.child_index "
strSQL = strSQL & " from [" & strRangeAddress & "] w "
strSQL = strSQL & " where w.child_index = 1 "
strSQL = strSQL & " order by v.child_index;"


    rs.Open strSQL, cn

    Debug.Print rs.GetString

End Sub

strSQL的debug.print是:

select v.child_index,v.child_level,v.parent_level,u.child_index as  parent_index 
from  
  (select s.* 
   from  
     (select t.*, row_number() over (partition by child_level order by child_index,child_level) [rownum] 
      from [mydata$A1:C30020] t
     ) s  
   where [rownum] = 1
  ) u  
join 
  (select t2.*, 1 as  [rownum] 
   from [mydata$A1:C30020] t2
  ) v  on (v.parent_level = u.child_level and v.[rownum] = u.[rownum])  

union 

select  w.child_index,w.child_level,w.child_level,w.child_index  
from [mydata$A1:C30020] w  
where w.child_index = 1  
order by v.child_index;

当我使用简单的strSQL字符串时,连接起作用并返回结果。这有效:

strSQL = "SELECT * FROM [" & strRangeAddress & "]"

我认为我的语法正确。是否可能由不兼容的SQL引起错误?例如,ADO可以做'分区'吗?

我正在使用Excel 2010 64位Office。

1 个答案:

答案 0 :(得分:0)

考虑使用行号的相关计数聚合查询来代替窗口函数,因为此子查询应该符合Jet / ACE SQL中的要求:

SELECT v.child_index, v.child_level, v.parent_level, u.child_index, v.parent_index 
FROM
  (SELECT s.* 
   FROM  
     (SELECT t.*, (SELECT count(*) FROM [mydata$A1:C30020] sub 
                   WHERE sub.child_index <= t.child_index
                   AND sub.child_level = t.child_level) as [rownum] 
      FROM [mydata$A1:C30020] t
     ) s  
   WHERE [rownum] = 1
  ) u  
INNER JOIN 
  (SELECT t2.*, 1 as [rownum] 
   FROM [mydata$A1:C30020] t2
  ) v  
ON (v.parent_level = u.child_level) AND (v.[rownum] = u.[rownum])  

UNION 

SELECT w.child_index, w.child_level, w.parent_level, w.child_index, w.parent_index 
FROM [mydata$A1:C30020] w  
WHERE w.child_index = 1  
ORDER BY v.child_index;