MS Access中Append查询为何不在Qdefs集合?如何获取其元数据?
获取Access Append查询的元数据
Append查询确实在Qdefs集合里,只是它的Type属性为dbQAppend(常量值64),且它的Fields集合是空的,没法直接像Select/Union那样读取字段。要获取它的查询名称、源字段和目标字段,有两种可靠方法:
方法1:解析Append查询的SQL语句
遍历Qdefs时筛选出类型为dbQAppend的查询,然后解析其SQL属性,提取目标表字段和源字段的映射关系。示例VBA代码:
Sub GetAppendQueryMetadata() Dim db As DAO.Database Dim qdf As DAO.QueryDef Dim sqlText As String Dim insertPart As String, selectPart As String Dim targetFields As Variant, sourceFields As Variant Dim i As Integer Set db = CurrentDb For Each qdf In db.QueryDefs ' 筛选Append查询 If qdf.Type = dbQAppend Then Debug.Print "查询名称: " & qdf.Name sqlText = qdf.SQL ' 拆分INSERT和SELECT部分 insertPart = Split(sqlText, "SELECT")(0) selectPart = "SELECT" & Split(sqlText, "SELECT")(1) ' 提取目标字段(如果有指定) If InStr(insertPart, "(") > 0 Then targetFields = Split(Mid(insertPart, InStr(insertPart, "(") + 1, InStr(insertPart, ")") - InStr(insertPart, "(") - 1), ",") End If ' 提取源字段 sourceFields = Split(Split(selectPart, "FROM")(0), ",") ' 输出字段映射 For i = LBound(sourceFields) To UBound(sourceFields) Dim targetField As String targetField = IIf(IsEmpty(targetFields), sourceFields(i), Trim(targetFields(i))) Debug.Print "源字段: " & Trim(sourceFields(i)) & " -> 目标字段: " & Trim(targetField) Next i Debug.Print "-------------------------" End If Next qdf Set qdf = Nothing Set db = Nothing End Sub
注意:如果Append查询用的是VALUES语法,需要调整解析逻辑,但大部分场景下Append是基于SELECT的。
方法2:查询Access系统表MSysQueries
Access的系统表MSysQueries存储了所有查询的底层定义,包括Append查询的字段映射。需要先确保你有该表的访问权限(默认可能隐藏,需手动显示系统对象)。示例SQL查询:
SELECT o.Name AS 查询名称, q1.Name AS 源字段, q2.Name AS 目标字段 FROM MSysObjects o INNER JOIN MSysQueries q ON o.Id = q.ObjectId LEFT JOIN MSysFields q1 ON q.Expr = "[" & q1.Name & "]" AND q.Attribute = 11 LEFT JOIN MSysFields q2 ON q.Expr = "[" & q2.Name & "]" AND q.Attribute = 10 WHERE o.Type = 5 ' 筛选查询对象 AND q.Attribute IN (10, 11) ' 10=目标字段,11=源字段 ORDER BY o.Name, q.Seq
执行这个SQL可以直接得到所有Append查询的字段映射关系。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

