Присоединиться к Excel-Table с сервером SQL - PullRequest
0 голосов
/ 16 июня 2020

Мой excel-лист связан с данными sql -сервера. Мои клиенты смогут записывать некоторые столбцы обратно на сервер sql. Имена файлов в формате Excel являются переменными, но имя листа и столбцы всегда имеют значение c. Я попробовал это с помощью кнопки и vba, но это привело к ошибке:

Syntaxerror (отсутствует оператор) в выражении запроса 'UPDATE hbs SET lieferinfo_prio_neu = xlsx.liefer_prio_neu FROM [Provider = SQLOLEDB; Data Source = myserver ; Database = mydb; UID = myuser; PWD = mypass;]. [Tbl_haka_base_size] hbs JOIN [Tabelle3 $] xlsx ON xlsx.Artikelnummer '

Внутреннее имя листа Excel -' Tabelle3 ', custom-name is 'Hakabase':

enter image description here

Я пробовал оба имени без какого-либо результата.

Мой код:

Dim excelConn As String
Dim sqlServerConn As String
Dim sqlCommand As String
Dim conn As ADODB.Connection

excelConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
           & ThisWorkbook.FullName _
           & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes;IMEX=1"";"

sqlServerConn = "[Provider=SQLOLEDB;" _
                & "Data Source=myserver;" _
                & "Database=mydb;" _
                & "UID=ymuser;PWD=mypass;]"

sqlCommand = "UPDATE hbs " _
        & " SET lieferinfo_prio_neu = xlsx.liefer_prio_neu " _
        & " FROM " & sqlServerConn & ".[tbl_haka_base_size] hbs " _
        & " JOIN [Tabelle3$] xlsx " _
        & "   ON xlsx.Artikelnummer=hbs.artikelnummer"


Set conn = New ADODB.Connection

conn.Open excelConn
conn.Execute sqlCommand

Я также пытался подключиться к sqlserver + присоединиться к excel-данным через openrowset, но сервер запретил это:

        & " JOIN OPENROWSET('MSDASQL', " _
        & "     'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" _
        &       ThisWorkbook.FullName & "', 'SELECT * FROM [Tabelle3$]') xlsx" _

Устанавливаемый ISAM не найден

Думаю, мне нужно создать связанный сервер для каждого файла и включить «InProcess» для этих файлов. Это невозможно, потому что файлы переменные.

1 Ответ

0 голосов
/ 16 июня 2020

Я нашел альтернативное решение, которое работает немного медленнее, поэтому я все еще надеюсь, что кто-то еще сможет ответить на мой вопрос.

Альтернативное решение - перебирать каждую строку .. Файл получил примерно 150 000 строк и всего 10 000 строк. Я жду около 10 минут ..

Вот часть итерации

    For Each range In sheet.rows: Do

    'Continue on headline
    If range.Row = 1 Or range.EntireRow.Hidden = True Then
        Exit Do
    End If


    If Len(sheet.Cells(range.Row, lieferInfoColumnIndex)) > 0 Then
        articleNumber = sheet.Cells(range.Row, artNoColumnIndex)
        UpdateDatabase (articleNumber)
        savings = savings + 1
    End If

    Loop While False: Next range

Вот функция медленного обновления для каждой строки:

Private Sub UpdateDatabase(articleNumber As String)

Dim sqlServerConn As String
Dim sqlCommand As String
Dim conn As ADODB.Connection


sqlServerConn = "Provider=SQLOLEDB;" _
                & "Data Source=myserver;" _
                & "Database=mydb;" _
                & "UID=myuser;PWD=mypass;"

sqlCommand = "UPDATE hbs " _
            & "SET lieferinfo_prio_neu=NULL " _
            & "FROM [TBL_HAKA_BASE] hbs " _
            & "WHERE Artikelnummer=" + articleNumber

Set conn = New ADODB.Connection

conn.Open sqlServerConn
conn.Execute sqlCommand
End Sub
...