Excel VBA执行SQL查询时部分字段值缺失 同语句在SSMS可正常获取
可能的原因及修复方案
- 代码笔误优先排查
你定义SomeFunc时的形参是recS,但函数内部取值时用的仍然是全局作用域的rec对象,部分场景下会出现记录集指针偏移、字段取值错位的问题。先把函数内部所有rec("字段名")修改为recS("字段名")验证是否恢复正常。 - 消除字段名歧义
你关联的A、B两张表都存在importnum_id字段,即使SELECT语句指定了取B.importnum_id,老旧的ADO驱动解析字段名时仍可能出现映射紊乱。建议给容易冲突的字段加别名:
VBA中通过别名SELECT A.xyz, A.style, A.color, B.vessel_name, B.location, B.importnum_id AS b_importnum_id, A.warehouse AS a_warehouse, A.qty1, A.qty2, A.qty FROM Wf20.dbo.A A, Wf20.dbo.B B WHERE ...rec("b_importnum_id")、rec("a_warehouse")取值即可。 - 修正记录集打开参数
你当前打开记录集时未指定游标类型,默认的前向只读游标在读取靠后位置的字段时,容易出现缓存异常,这也是你去掉If rec("qty")>0判断后非空字段变多的核心原因。打开记录集时指定静态游标:' 已引用ADO库时写法 rec.Open comm, , adOpenStatic, adLockReadOnly ' 未引用ADO库时直接写常量值 rec.Open comm, , 3, 1 - 更新连接驱动
如果你VBA中用的还是老旧的SQLOLEDB驱动,对SQL Server的新数据类型(比如varchar(max)、uniqueidentifier等)支持存在缺陷,会随机出现字段返回空值的问题,替换为最新的MSOLEDBSQL驱动即可解决。 - 可选优化:改用参数化查询
你当前直接拼接字符串的查询方式容易出现隐式类型转换问题,还存在SQL注入风险,改成参数化查询可以避免这类问题:comm.CommandText = _ "SELECT A.xyz, A.style, A.color, " & _ "B.vessel_name, B.location, B.importnum_id AS b_importnum_id, A.warehouse AS a_warehouse, " & _ "A.qty1, A.qty2, A.qty " & _ "FROM Wf20.dbo.A A INNER JOIN Wf20.dbo.B B ON B.fileno = A.fileno AND A.importnum_id = B.importnum_id " & _ "WHERE A.xyz = ?" comm.Parameters.Append comm.CreateParameter("@conNum", adVarChar, adParamInput, 50, conNum)
内容的提问来源于stack exchange,提问作者Ebay Eliav
相关产品推荐
相关产品推荐

