2017-10-28 55 views
0

VBA 프로그램에서 SQL UPDATE 쿼리를 구성하려고합니다.VBA ADO 쿼리에서 OPENROWSET

기본적으로 현재 통합 문서의 테이블을 닫힌 통합 문서의 테이블에서 업데이트합니다. 이 원본 통합 문서는 .xls 파일 인 경우에만 아래의 쿼리를 사용하여 좋은 작품 :

내가/같은 공급자를 사용하여 소스에 연결하려는 소스 파일로 .XLSX 파일을 사용하기 위해
Sub UPDATEQUERY(SourcePath As String, SourceSheet As String, TargetSheet As String, _ 
Columns As String, Filter As String) 

    Dim Cn As ADODB.Connection 
    Dim QUERY_SQL As String 
    Dim CHAINE_HDR As String 
    Dim STRCONNECTION As String 

    CHAINE_HDR = "[Excel 8.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=1;Extended Properties='HDR=YES;'] " 

    Set Cn = New ADODB.Connection 

    QUERY_SQL = _ 
    "UPDATE [" & TargetSheet & "$] INNER JOIN (SELECT * FROM [" & SourceSheet & "$] " & _ 
    "IN '" & SourcePath & "' " & CHAINE_HDR & ") t2 " & _ 
    "ON [" & TargetSheet & "$].id = t2.id " & _ 
    "SET [" & TargetSheet & "$].ColA = t2.ColA " 

    STRCONNECTION = _ 
    "Driver={Microsoft Excel Driver (*.xls)};" & _ 
    "DriverId=790;" & _ 
    "Dbq=" & ThisWorkbook.FullName & ";" & _ 
    "DefaultDir=" & ThisWorkbook.FullName & ";ReadOnly=False;" 


    Cn.Open STRCONNECTION 
    Cn.Execute (QUERY_SQL) 

    '--- Fermeture connexion --- 
    Cn.Close 
    Set Cn = Nothing 

End Sub 

드라이버를 사용하여 현재 wb (Microsoft.ACE.OLEDB.12.0 대신 MSDASQL.1)에 연결합니다. 실제로 'CHAINE_HDR'을 Excel 12.0으로 설정하면 "ISAM 드라이버를 찾을 수 없습니다"라는 메시지가 나타납니다.

내가이 같은 OPENROWSET을 사용하기 위해 노력하고있어이를 달성하기
Sub UPDATEQUERY(SourcePath As String, SourceSheet As String, TargetSheet As String, _ 
Columns As String, Filter As String) 

    Dim Cn As ADODB.Connection 
    Dim QUERY_SQL As String 
    Dim STRCONNECTION As String 
    Dim STRCONNECTION_SOURCE As String 


    STRCONNECTION_SOURCE = _ 
    "'MSDASQL.1'," & _ 
    "'Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=" & SourcePath & ";'," & _ 
    "'SELECT * FROM [Data$]'" 

    Set Cn = New ADODB.Connection 

    QUERY_SQL = _ 
    "UPDATE [" & TargetSheet & "$] INNER JOIN (SELECT * FROM OPENROWSET(" & STRCONNECTION_SOURCE & ")) t2 " & _ 
    "ON [" & TargetSheet & "$].id = t2.id " & _ 
    "SET [" & TargetSheet & "$].ColA = t2.ColA " 

    STRCONNECTION = _ 
    "Driver={Microsoft Excel Driver (*.xls)};" & _ 
    "DriverId=790;" & _ 
    "Dbq=" & ThisWorkbook.FullName & ";" & _ 
    "DefaultDir=" & ThisWorkbook.FullName & ";ReadOnly=False;" 


    Cn.Open STRCONNECTION 
    Cn.Execute (QUERY_SQL) 

    '--- Fermeture connexion --- 
    Cn.Close 
    Set Cn = Nothing 

End Sub 

그러나 나는 "절에서 Synthax 오류"는 를 얻을.

SQL 쿼리를 올바르게 설정하는 방법은 무엇입니까?

감사

답변

1

첫째, OPENROWSET는 마이크로 소프트 SQL 서버 방법 (즉, TSQL) 귀하의 링크 참조입니다. 이러한 쿼리는 SQL Server 쿼리 내에서만 실행됩니다. Jet/ACE SQL 엔진 (현재 사용중인) 메소드가 아닙니다. 따라서 데이터베이스를 겹쳐 쓰게됩니다. 비유하자면 Oracle의 방법은 Postgres 데이터베이스에서는 작동하지 않습니다.

그리고 예, ACE 12.0 제공자는 단지와는 가능한 한 모두 나이가 .XLS 현재 .XLSX 파일에 연결할 수 오래된 MS 액세스 (MS 엑셀 오피스 형제) .MDB 현재 .accdb 파일 간단히 버전을 변경하십시오 : Excel 8.0;Excel 12.0 Xml;으로 변경하십시오.

사실, 당신도 다음 형식을 사용하여 인라인 SQL 명령에 제공를 지정할 필요가 없습니다 :

...INNER JOIN [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\File.xlsx].[SHEETNAME$] 
높은 데이터베이스 요구 사항에 대한 조언 MS 액세스 (와

, 사용 가능한

...INNER JOIN [C:\Path\To\Access\File.mdb].[TABLENAME] 

...INNER JOIN [C:\Path\To\Access\File.accdb].[TABLENAME] 
+0

문제는 내가 당신의 내면은 여전히 ​​내 가입하고 사용하는 경우입니다 : 모든 Windows 시스템에 관계없이 MSACCESS.EXE 응용 프로그램의) 설치 여부, 당신은 엑셀 매개 변수를 지정할 필요가 없습니다 것입니다 연결 문자열 (STRCONNECTION) MSDQSL 함께 'ISAM 드라이버를 찾을 수 없습니다.' ACE 대신이 공급자를 사용하는 진정한 이유는 ACE가 "연결된 Excel 스프레드 시트에 있기 때문에이 필드를 편집 할 수 없습니다."라는 오류가 발생하기 때문입니다. 내가 읽은 바로는 ACE를 예전 MSDASQL.1로 대체해야했습니다. 내 연결 문자열이 소스 파일의 'Excel 12.0'과 호환되지 않습니다. {{Microsoft Excel 드라이버 (* .xls, * .xlsx, * .xlsm, * .xlsb)} '를 사용하면 연결된 Excel 스프레드 시트 오류도 발생합니다. – Lich4r

+0

그러면 원래 구문을 그대로 유지하고 버전을 변경하십시오 :'Excel 12.0 Xml;'. 죄송합니다. 통합 문서에서 업데이트 쿼리를 실행하지 않으며 Excel이 데이터베이스가 아니므로 해당 경로를 벗어나지 않으려 고합니다. – Parfait

+0

그런데 ACE는 통합 문서에 연결하는 데 사용되는 엔진이며 OLEDB 공급자 및 ODBC 드라이버는 연결할 수있는 API입니다. 그들은 상호 보완적이고 대체 소프트웨어가 아닙니다.ACE.12.0은 .xlsx 파일에 연결해야합니다. 이전 Jet 4.0은 .xls 파일로 제한되었습니다. – Parfait