2016-04-17 2 views
1

Следующий 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.

+0

Я reformated своего длинных встроенного SQL запроса, поскольку он не был вообще понятно. Когда проверка будет принята, снова проверьте запрос, чтобы убедиться, что это правильно. Я лучше рассмотрю вашу проблему позже. –

+0

** Pro tip **: когда вы создаете такой длинный и сложный запрос в своем коде с помощью 'strSQL = strSQL &', добавьте '& vbcrlf' в конце каждой строки поэтому запрос становится понятным, когда вы 'debug.print strSQL' –

+1

Механизм Jet/ACE SQL, который вы используете для подключения к книге Excel, не поддерживает функции окна в диалекте, поэтому вы не можете использовать' RowNumber() ',' Over() 'или' Partition'. – Parfait

ответ

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; 
+0

Я удалил вопрос, который вы ответили после реализации того же. Просто попробовал SQL в VBA и он дал «Нет значения для одной или нескольких ошибок требуемых параметров». Я не на машине с SQL Server или Access, поэтому не могу тестировать SQL за пределами VBA. – curtisp

+0

Можете ли вы проверить, имеет ли верхний заголовок '[mydata $ A1: C30020]' столбцы полей в точности как указано: child_index, child_level, parent_level, child_index, parent_index. – Parfait

+0

коррекция child_index, child_level, parent_level, child_index как parent_index – curtisp