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。