【问题标题】:How to find all queries related to table in MS Access如何在 MS Access 中查找与表相关的所有查询
【发布时间】:2011-12-11 11:27:50
【问题描述】:

我有一个数据库。在这我有数百个表格、宏和表格。 不,我的问题是我必须找到与特定表相关的所有查询、宏。

我正在使用 microsoft access 2000。

但我什至在 access 2007 中尝试了对象依赖项,它显示了很多错误并自动关闭。

有没有什么简单的方法可以得到这个???

谢谢, 山木根

【问题讨论】:

    标签: ms-access ms-access-2007


    【解决方案1】:

    您可以尝试直接对系统表执行 SQL 查询,以更用户友好的方式获取 2003+ 版本中显示的依赖项。我不确定这是否适用于 2000 年(它适用于 2003 年以上),但值得尝试:

    SELECT DISTINCT MSysObjects.Name
    FROM MSysQueries INNER JOIN MSysObjects ON MSysQueries.ObjectId=MSysObjects.Id
    WHERE (((MSysQueries.Name1) Like "*" & [TableName] & "*")) OR (((MSysQueries.Name2) Like "*" & [TableName] & "*"))
    

    您可能需要检查您是否有权访问系统表...

    希望对你有帮助

    【讨论】:

    • 嗨,Igor Turman,这真的很有帮助。您能说一下如何查找与特定查询相关的查询和表吗?
    • 谢谢。您在 MS Access 中的何处执行此查询?
    【解决方案2】:

    您可以购买可以为您执行此操作的第三方软件,但我从未觉得需要这样做。相反,我编写了几个可以做到这一点的程序。它们需要对 DAO 的引用。

    第一个(SearchQueries)只搜索查询文本并且运行速度非常快。第二个(SearchDB)搜索表单、宏、查询、报告和代码。它需要更长的时间,但非常彻底。用法应该是不言自明的,但如果您不确定,请提出问题。

    这是程序的全文:

    Sub SearchQueries(SearchText As String, _
                      Optional ShowSQL As Boolean = False, _
                      Optional QryName As String = "*")
        On Error Resume Next
        Dim QDef As QueryDef
    
        For Each QDef In CurrentDb.QueryDefs
            If QDef.Name Like QryName Then
                If InStr(QDef.SQL, SearchText) > 0 Then
                    Debug.Print QDef.Name
                    If ShowSQL Then Debug.Print QDef.SQL & vbCrLf
                End If
            End If
        Next QDef
    End Sub
    
    
    'Updated: 1/19/09 Limit search by object name pattern
    Sub SearchDB(SearchText As String, _
                 Optional ObjType As AcObjectType = acDefault, _
                 Optional ObjName As String = "*")
    Dim db As Database, obj As AccessObject, Ctl As Control, Prop As Property
    Dim Frm As Form, Rpt As Report, mdl As Module
    Dim objLoaded As Boolean, Found As Boolean, Instances As Long
    Dim SLine As Long, SCol As Long, ELine As Long, ECol As Long
    
        On Error GoTo Err_SearchDB
    
        Set db = CurrentDb
        Application.Echo False
    
        '===============================================
        'Search queries
        If ObjType = acDefault Or ObjType = acQuery Then
            Debug.Print "Queries:"
            SearchQueries SearchText, False, ObjName
            Debug.Print vbCrLf
        End If
    
    
        '===============================================
        'Search forms
        If ObjType = acDefault Or ObjType = acForm Then
            Debug.Print "Forms:"
            On Error Resume Next
            For Each obj In CurrentProject.AllForms
                If obj.Name Like ObjName Then
                    objLoaded = obj.IsLoaded
                    If Not obj.IsLoaded Then DoCmd.OpenForm obj.Name, acDesign, , , , acHidden
                    Set Frm = Application.Forms(obj.Name)
                    For Each Prop In Frm.Properties
                        Err.Clear
                        If InStr(Prop.Value, SearchText) > 0 Then
                            If Err.Number = 0 Then
                                Debug.Print "Form: " & Frm.Name & _
                                            "  Property: " & Prop.Name & _
                                            "  Value: " & Prop.Value
                            End If
                        End If
                    Next Prop
                    If Frm.HasModule Then
                        SLine = 0: SCol = 0: ELine = 0: ECol = 0: Instances = 0
                        Found = Frm.Module.Find(SearchText, SLine, SCol, ELine, ECol)
                        Do Until Not Found
                            Instances = Instances + 1
                            SLine = ELine + 1: SCol = 0: ELine = 0: ECol = 0
                            Found = Frm.Module.Find(SearchText, SLine, SCol, ELine, ECol)
                        Loop
                        If Instances > 0 Then Debug.Print "Form: " & Frm.Name & _
                           "  Module: " & Instances & " instances"
    
                    End If
                    For Each Ctl In Frm.Controls
                        For Each Prop In Ctl.Properties
                            Err.Clear
                            If InStr(Prop.Value, SearchText) > 0 Then
                                If Err.Number = 0 Then
                                    Debug.Print "Form: " & Frm.Name & _
                                                "  Control: " & Ctl.Name & _
                                                "  Property: " & Prop.Name & _
                                                "  Value: " & Prop.Value
                                End If
                            End If
                        Next Prop
                    Next Ctl
                    Set Frm = Nothing
                    If Not objLoaded Then DoCmd.Close acForm, obj.Name, acSaveNo
                    DoEvents
                End If
            Next obj
            On Error GoTo Err_SearchDB
            Debug.Print vbCrLf
        End If
    
    
        '===============================================
        'Search modules
        If ObjType = acDefault Or ObjType = acModule Then
            Debug.Print "Modules:"
            For Each obj In CurrentProject.AllModules
                If obj.Name Like ObjName Then
                    objLoaded = obj.IsLoaded
                    If Not objLoaded Then DoCmd.OpenModule obj.Name
                    Set mdl = Application.Modules(obj.Name)
                    SLine = 0: SCol = 0: ELine = 0: ECol = 0: Instances = 0
                    Found = mdl.Find(SearchText, SLine, SCol, ELine, ECol)
                    Do Until Not Found
                        Instances = Instances + 1
                        SLine = ELine + 1: SCol = 0: ELine = 0: ECol = 0
                        Found = mdl.Find(SearchText, SLine, SCol, ELine, ECol)
                    Loop
                    If Instances > 0 Then Debug.Print obj.Name & ": " & Instances & " instances"
                    Set mdl = Nothing
                    If Not objLoaded Then DoCmd.Close acModule, obj.Name
                End If
            Next obj
            Debug.Print vbCrLf
        End If
    
    
        '===============================================
        'Search macros
        If ObjType = acDefault Or ObjType = acMacro Then
            'Debug.Print "Macros:"
            'Debug.Print vbCrLf
        End If
    
    
        '===============================================
        'Search reports
        If ObjType = acDefault Or ObjType = acReport Then
            Debug.Print "Reports:"
            On Error Resume Next
            For Each obj In CurrentProject.AllReports
                If obj.Name Like ObjName Then
                    objLoaded = obj.IsLoaded
                    If Not obj.IsLoaded Then DoCmd.OpenReport obj.Name, acDesign
                    Set Rpt = Application.Reports(obj.Name)
                    For Each Prop In Rpt.Properties
                        Err.Clear
                        If InStr(Prop.Value, SearchText) > 0 Then
                            If Err.Number = 0 Then
                                Debug.Print "Report: " & Rpt.Name & _
                                            "  Property: " & Prop.Name & _
                                            "  Value: " & Prop.Value
                            End If
                        End If
                    Next Prop
                    If Rpt.HasModule Then
                        SLine = 0: SCol = 0: ELine = 0: ECol = 0: Instances = 0
                        Found = Rpt.Module.Find(SearchText, SLine, SCol, ELine, ECol)
                        Do Until Not Found
                            Instances = Instances + 1
                            SLine = ELine + 1: SCol = 0: ELine = 0: ECol = 0
                            Found = Rpt.Module.Find(SearchText, SLine, SCol, ELine, ECol)
                        Loop
                        If Instances > 0 Then Debug.Print "Report: " & Rpt.Name & _
                           "  Module: " & Instances & " instances"
    
                    End If
                    For Each Ctl In Rpt.Controls
                        For Each Prop In Ctl.Properties
                            If InStr(Prop.Value, SearchText) > 0 Then
                                Debug.Print "Report: " & Rpt.Name & _
                                            "  Control: " & Ctl.Name & _
                                            "  Property: " & Prop.Name & _
                                            "  Value: " & Prop.Value
                            End If
                        Next Prop
                    Next Ctl
                    Set Rpt = Nothing
                    If Not objLoaded Then DoCmd.Close acReport, obj.Name, acSaveNo
                    DoEvents
                End If
            Next obj
            On Error GoTo Err_SearchDB
            Debug.Print vbCrLf
        End If
    
    Exit_SearchDB:
        Application.Echo True
        Exit Sub
    Err_SearchDB:
        Application.Echo True
        Debug.Print Err.Description
        Debug.Assert False
        Resume
    End Sub
    

    【讨论】:

    • 感谢您的回复 mwolfe02。 (抱歉回复晚了)。正如你所说,第一个模块简单易懂。虽然第二个对我来说太复杂了。但我还没有尝试过。我会通过 tomo 去办公室,然后两个都试一下,然后告诉你。如果我没有进一步了解,我会告诉你。
    • 非常感谢。请记住,要运行代码,您需要引用 DAO(工具|参考|添加 Microsoft Office 数据访问引擎对象...)
    • @mwolfe02 这可能是一个愚蠢的问题,但是当程序应该在错误时转到 Err_SearchDB 时,为什么你有两个 Err_Search DB 术语?
    • @114:我不确定我是否理解你的问题。但我查看了我的代码并意识到我的On Error Goto 0 行应该是On Error Goto Err_SearchDB。这是否消除了混乱?
    【解决方案3】:

    对于像我一样找到此页面的其他人,下面是一个变体,其中包括在所有查询的表或表达式中出现的字符串。 (这在 Access 2003 和 Access 2013 中都有效。)

    SELECT DISTINCT 
    MSysObjects.Name, MSysQueries.Name1, MSysQueries.Name2, MSysQueries.Expression
    FROM 
    MSysQueries 
    INNER JOIN 
    MSysObjects ON MSysQueries.ObjectId = MSysObjects.Id
    WHERE 
    (   (((MSysQueries.Name1) Like "*" & [String to search for] & "*")) 
     OR (((MSysQueries.Name2) Like "*" & [String to search for] & "*"))
     OR (((MSysQueries.Expression) Like "*" & [String to search for] & "*"))  )
    
    And "Comment:  You will be prompted once, for the [String to search for]"<>""
    And "Comment:  The starting point for this code came from link:"<>
    "http://stackoverflow.com/questions/7831071/how-to-find-all-queries-related-to-table-in-ms-access# "
    ;
    

    【讨论】:

      【解决方案4】:
      SELECT DISTINCT 
      MSysObjects.Name, MSysQueries.Name1, MSysQueries.Name2, MSysQueries.Expression
      FROM 
      MSysQueries 
      INNER JOIN 
      MSysObjects ON MSysQueries.ObjectId = MSysObjects.Id;
      

      这给了我一张我正在寻找的所有东西的表格。谢谢伊戈尔。

      【讨论】:

      • 您能否edit 解释您对 Igor 的回答所做的更改导致了这一点?
      猜你喜欢
      • 1970-01-01
      • 2021-01-11
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多