【问题标题】:Export all MS Access SQL queries to text files将所有 MS Access SQL 查询导出到文本文件
【发布时间】:2010-11-19 12:24:28
【问题描述】:

我必须记录一个包含许多宏查询等的 MS Access 数据库。我希望使用代码将每个 SQL 查询提取到一个与查询名称相同的文件中,例如,如果一个查询名为 q_warehouse_issues,那么我希望将 SQL 提取到名为 q_warehouse_issues.sql 的文件中

我不想导出查询结果集,只想导出 SQL!

我知道我可以在 Access 中手动执行此操作,但我厌倦了所有的点击、保存等操作。

【问题讨论】:

  • 我个人只是导出查询名称并记录它们的用途。而不是完整的 SQL 字符串。在这样的情况下,所有文档都会很快过时,因为数据库工作人员有更好的事情要做,而不是每次进行更改时记住保存查询字符串。

标签: sql vba ms-access


【解决方案1】:

这应该让你开始:

  Dim db As DAO.Database
  Dim qdf As DAO.QueryDef

  Set db = CurrentDB()
  For Each qdf In db.QueryDefs
    Debug.Print qdf.SQL
  Next qdf
  Set qdf = Nothing
  Set db = Nothing

您可以使用文件系统对象或内置的 VBA 文件 I/O 功能将 SQL 写入文件。我假设您问的更多是关于如何获取 SQL 的问题,而不是关于如何写出文件的问题,但是如果您需要,请在评论中说出来,我会编辑帖子(或者有人会发布他们自己的答案说明)。

【讨论】:

  • 大卫,非常感谢。这正是我所需要的(如何获取 SQL)。应该让生活变得轻松......
  • 才发现如何标记它。这并不明显,但 StackOverflow 很棒!
【解决方案2】:

希望这会有所帮助。

Public Function query_print()
Dim db As Database
Dim qr As QueryDef

Set db = CurrentDb

For Each qr In db.QueryDefs
  TextOut (qr.Name)
  TextOut (qr.SQL)
  TextOut (String(100, "-"))
Next
End Function

Public Sub TextOut(OutputString As String)

    Dim fh As Long

    fh = FreeFile
    Open "c:\File.txt" For Append As fh
    Print #fh, OutputString
    Close fh

End Sub

【讨论】:

    【解决方案3】:

    此解决方案在查询中包含字段

    Public Sub ListQueries()
        ' Author:                     Date:               Contact:
        ' André Bernardes             09/09/2010 08:45    bernardess@gmail.com     http://al-bernardes.sites.uol.com.br/
        ' Lista todas as queries da aplicação.
        ' Listening:
    
        Dim i As Integer
        Dim j As Integer
        Dim k As Integer
        Dim l As Integer
    
        On Error Resume Next
    
        For i = 0 To CurrentDb.QueryDefs.Count - 1
            Debug.Print "Query: " & CurrentDb.QueryDefs(i).Name
    
            For j = 0 To CurrentDb.QueryDefs(i).Fields.Count - 1
                Debug.Print "Field " & CurrentDb.QueryDefs(i).Fields(j).Name
            Next
    
            Debug.Print "  SQL: " & CurrentDb.QueryDefs(i).SQL
        Next
    End Sub
    

    【讨论】:

    • 请不要使用签名块。关于您的问题和答案,有一个指向您的个人资料的链接,作为您在 SO 上的签名。人们可以点击它来查看您的个人资料,您可以在那里发布您想要的任何联系信息。
    • 老兄,你不知道你刚刚为我节省了多少工作。谢谢!
    • 必须是For i = 0 To CurrentDb.QueryDefs.Count - 1 而不是TableDefs
    【解决方案4】:
    1. 在 VB 窗口中,点击Tools->References....
    2. 在“参考”窗口中,通过勾选添加依赖项Microsoft Scripting Runtime

    然后此代码会将查询导出到适合使用 grep on 的文件:

    Sub ExportQueries()
    
      Dim fso As New FileSystemObject
    
      Dim stream As TextStream
    
      Set stream = fso.CreateTextFile("e:\temp\queries.txt")
    
      Dim db As DAO.Database
      Dim qdf As DAO.QueryDef
    
      Set db = CurrentDb()
      For Each qdf In db.QueryDefs
    
        stream.writeline "Name: " & qdf.Name
        stream.writeline qdf.SQL
        stream.writeline "--------------------------"
      Next qdf
      Set qdf = Nothing
      Set db = Nothing
    
    End Sub
    

    【讨论】:

      【解决方案5】:

      我修改了@andre-bernardes 的代码以使用 “|”查询名称前的分隔符 SQL 语句前的分隔符和“:”。 不同的分隔符使使用 python 解析Queries.txt 文件并创建查询和 SQL 语句的字典变得更加容易。 例如,您可以使用此字典在 SQLite 表中创建视图。

      提取 SQL 查询的 VBA 代码

      Public Sub ListQueries()
          ' Modified from André Bernardes
          Dim i As Integer
          Dim ff As Long
          ff = FreeFile()
          Open "C:\Dev\Queries.txt" For Output As #ff
          On Error Resume Next
      
          For i = 0 To CurrentDb.QueryDefs.Count - 1
              Debug.Print "|" & CurrentDb.QueryDefs(i).Name & ":"
              Print #ff, "|" & CurrentDb.QueryDefs(i).Name & ":"
      
              Debug.Print CurrentDb.QueryDefs(i).SQL
              Print #ff, CurrentDb.QueryDefs(i).SQL
          Next
      End Sub
      

      将 Queries.txt 解析为字典的 Python 代码

      queries_file = open(data_path + '/Queries.txt')
      queries = queries_file.read().split('|')
      l = [x.split(':') for x in queries]
      l.pop(0)
      table_name_to_query = {name: query for name, query in l}
      

      从 Access 查询创建 SQLite 视图

      import sqlite3
      conn = sqlite3.connect('example.db')
      c = conn.cursor()
      for table, query in table_name_to_query.items():
          try:
              c.execute("CREATE VIEW `%s` AS %s" % (table,query))
              print("\n\n"+ table + " passed")
              print(query)
          except Exception as e:
              print("\n\n"+ table + " error")
              print(e)
              print(query)
      

      【讨论】:

      • 我建议为此创建一个新的(自我回答的)问题,因为这里相关的新事物是 Python 和 SQLite 部分。
      • 感谢@Andre,我发布了一个新的自我回答问题:How to convert MS Access queries to SQLite views?,但根据另一位用户的说法,这还不够好。
      • 好吧,我无法评论 Python 部分,但恕我直言,这个问题很好。它似乎会带来新的知识。 :)
      • @Paul Rougieux 指向另一个问题的链接已损坏
      • @jabellcu 是的,我的自我回答问题已关闭:“此帖子已隐藏。它在 9 个月前被自动删除”[...]“已关闭。这个问题需要更加集中。”这和这个答案是一样的。唯一有趣的部分是关于 SQL 语法差异的评论线程。
      猜你喜欢
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      相关资源
      最近更新 更多