用SQL服务器加入Excel表

问题描述 投票:0回答:1

我的excel表与sql服务器的数据连接。我的客户可以将一些列写回sql服务器。excel-filenames是可变的,但sheeetname和列总是静态的。我试过用按钮和vba,但最后都出错了。

在查询表达式 "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',自定义名称是'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

我也试过通过openrowset连接到sqlserver+加入excel数据 但服务器不允许这样做

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

"找不到可安装的ISAM

我想我必须为每个文件创建一个链接服务器,并为这些文件启用 "InProcess"。这是不可能的,因为文件是可变的。

sql-server excel vba oledb adodb
1个回答
0
投票

我找到了一个替代方案,速度有点慢,所以还是希望有人能回答我的问题。

替代方案是迭代每一行......。这个文件大约有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
© www.soinside.com 2019 - 2024. All rights reserved.