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
相关产品推荐
相关产品推荐

