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

2023-12-09

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。


考虑使用行号的相关计数聚合查询来代替窗口函数,因为该子查询应符合 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel VBA ADO SQL - From 子句中的语法错误 的相关文章

随机推荐