Следующий SQL в VBA ADO дает «синтаксическую ошибку в ошибке предложения From».Excel 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
Debug.Print из strSQL является:
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.
Я reformated своего длинных встроенного SQL запроса, поскольку он не был вообще понятно. Когда проверка будет принята, снова проверьте запрос, чтобы убедиться, что это правильно. Я лучше рассмотрю вашу проблему позже. –
** Pro tip **: когда вы создаете такой длинный и сложный запрос в своем коде с помощью 'strSQL = strSQL &', добавьте '& vbcrlf' в конце каждой строки поэтому запрос становится понятным, когда вы 'debug.print strSQL' –
Механизм Jet/ACE SQL, который вы используете для подключения к книге Excel, не поддерживает функции окна в диалекте, поэтому вы не можете использовать' RowNumber() ',' Over() 'или' Partition'. – Parfait