【问题标题】:Join Excel-Table with SQL Server将 Excel 表与 SQL Server 联接
【发布时间】:2020-10-06 00:38:43
【问题描述】:

我的 excel-sheet 与 sql-server 的数据相连。我的客户应该能够将一些列写回 sql server。 excel 文件名是可变的,但工作表名和列始终是静态的。我用按钮和 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-sheetname是'Tabelle3',自定义名称是'Hakabase':

我尝试了这两个名称,但没有任何结果。

我的代码:

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-data,但服务器不允许这样做:

        & " 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】:

    我找到了一个有点慢的替代解决方案,所以我仍然希望其他人能够回答我的问题。

    另一种解决方案是遍历每一行。该文件大约有 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
    

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 2023-03-29
      • 2022-01-12
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      相关资源
      最近更新 更多