You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA经VPN向Azure SQL Server传输数据不完整问题求助

Azure SQL Server VBA导入数据不全问题排查与解决

可能的原因

  • 单批SQL语句长度超限:ODBC驱动或SQL Server对单次执行的SQL脚本有默认长度限制,801条INSERT打包成一个字符串执行时,超出限制导致后续语句被截断,且因无语法错误驱动未抛出异常,仅执行了前部分语句。
  • VPN隐性丢包:VPN隧道传输大脚本时可能出现隐性丢包,ADODB的Execute方法在这种场景下可能不会触发报错,导致后续INSERT未被服务器接收执行。
  • 自动提交模式的隐性问题:默认自动提交模式下每条INSERT单独提交,若某条语句存在隐性数据问题(如字段值超长被静默截断),可能导致后续执行终止,但此情况概率较低,因用户反馈导入顺序与Excel一致。

解决方案

1. 拆分批量执行

避免一次性执行所有INSERT,拆分批次执行(比如每100条一批),降低单批SQL长度:

Sub Importer(ByVal tableName As String, ByVal importQueries As Variant, pass As String)
    Dim con As Object
    Dim i As Integer
    Dim batchSQL As String
    
    Set con = CreateObject("ADODB.Connection")
    con.Open _
            "Driver={ODBC Driver 17 for SQL Server};" & _
            "Server=tcp:myServer,1433;" & _
            "Database=myDB;" & _
            "Uid=admin;" & _
            "Pwd=" & pass & ";" & _
            "TrustServerCertificate=no;" & _
            "Connection Timeout=30;" & _
            "Encrypt=yes;"
    
    batchSQL = ""
    For i = LBound(importQueries) To UBound(importQueries)
        batchSQL = batchSQL & importQueries(i) & vbCrLf
        ' 每100条执行一次批次
        If (i - LBound(importQueries) + 1) Mod 100 = 0 Then
            con.Execute batchSQL
            batchSQL = ""
        End If
    Next i
    ' 执行剩余未达批次的语句
    If batchSQL <> "" Then
        con.Execute batchSQL
    End If
    
    con.Close
    Set con = Nothing
End Sub

(注:需将原importQuery拆分为包含单条INSERT的数组传入)

2. 启用显式事务

将所有操作纳入事务,确保要么全成功要么全失败,同时能捕获隐性错误:

Sub Importer(ByVal tableName As String, ByVal importQuery As String, pass As String)
    Dim con As Object
    
    Set con = CreateObject("ADODB.Connection")
    con.Open _
            "Driver={ODBC Driver 17 for SQL Server};" & _
            "Server=tcp:myServer,1433;" & _
            "Database=myDB;" & _
            "Uid=admin;" & _
            "Pwd=" & pass & ";" & _
            "TrustServerCertificate=no;" & _
            "Connection Timeout=30;" & _
            "Encrypt=yes;"
    
    con.BeginTrans
    On Error GoTo RollbackHandler
    con.Execute importQuery
    con.CommitTrans
    con.Close
    Set con = Nothing
    Exit Sub
    
RollbackHandler:
    con.RollbackTrans
    MsgBox "导入失败: " & Err.Description
    con.Close
    Set con = Nothing
End Sub

3. 调整ODBC数据包大小

在连接字符串中增加数据包大小配置,适配大脚本传输:

con.Open _
        "Driver={ODBC Driver 17 for SQL Server};" & _
        "Server=tcp:myServer,1433;" & _
        "Database=myDB;" & _
        "Uid=admin;" & _
        "Pwd=" & pass & ";" & _
        "TrustServerCertificate=no;" & _
        "Connection Timeout=30;" & _
        "Encrypt=yes;" & _
        "Packet Size=16384;"

4. 检查VPN MTU设置

联系VPN管理员调整隧道MTU值(建议设为1400),避免大SQL数据包分片丢失。

内容的提问来源于stack exchange,提问作者ruedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:35:23