使用 VBA 或 PowerShell 将所有 MS Access SQL 查询导出到文本文件

Posted

技术标签:

【中文标题】使用 VBA 或 PowerShell 将所有 MS Access SQL 查询导出到文本文件【英文标题】:Using VBA OR PowerShell to export all MS Access SQL queries to text files 【发布时间】:2019-06-19 07:15:21 【问题描述】:

希望从 access 2013 导出约 200 个查询的底层 sql 到单独的 txt/*.sql 文件 - 而不是查询收集的数据。

这个问答提供了一个合适的答案:Using VBA to export all MS Access SQL queries to text files 但我无法让它生成输出文件。我是 vba 新手,但需要一次性完成。这样可以节省很多时间。

我还在这里查看了使用 PowerShell 脚本: Export all queries of an access database with powershell 同样,我无法让它生成输出文件。

我不介意我使用哪个进程,我只需要 sql :)

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
$dbe = New-Object -com DAO.DBEngine.120
$db = $dbe.OpenDatabase("C:\Users\Public\Database1.accdb")
$queries = $db.QueryDefs
ForEach ($query in $queries) 
    $name = $query.Name
    If (!$name.StartsWith("~")) 
        $name
    

VBA:没有返回错误消息,但我怀疑它缺少代码的输出组件。

PowerShell:没有返回错误消息,但同样缺少代码的输出组件。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

让我们调整 VBA 解决方案。第 1 步是声明一个接受输入并将其写入文本文件的函数:

'Writes content to a text file
'Note: encoding = UTF-16, overwrites without prompt
Public Sub ToTextFile(path As String, content As String)
    If Dir(path) <> "" Then Kill path
    Dim f As Integer
    f = FreeFile
    Open path For Binary Access Write As #f
    Put #f, , content
    Close #f
End Sub

然后,我们可以轻松调整您当前的代码,将每个查询放在单独的文本文件中。我将使用您的数据库的路径和查询的名称作为文本文件的位置:

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

 Set db = CurrentDB()
 For Each qdf In db.QueryDefs
   If qdf.Name Not Like "~*" Then
       ToTextFile CurrentProject.Path & "\" & qdf.Name & ".txt", qdf.sql
   End If
 Next qdf
 Set qdf = Nothing
 Set db = Nothing

【讨论】:

一个可能很愚蠢的问题——但这两个部分是在一个“模块”中还是在两个不同的模块中?我尝试了两种方式,但是当我单击运行时,它会启动选择宏框,显示为空。 Eh...您需要将第二段代码包装在一个子中,例如Public Sub SomeName(),然后是代码,然后是 End Sub。我从问题中复制了它,我假设你已经这样做了。不管是一个模块还是两个模块。我确实建议学习基本的 VBA 教程,在不知道它在做什么的情况下粘贴代码是一件棘手的事情。 是的,没错 - 它被包裹在公共子/结束子中。我收到错误的文件名或编号错误 - 我怀疑这是由于在某些查询名称中使用了“*”。 是的,要么调整你的查询名称,要么编写一个函数来清理它们。请注意,在 SQL、VBA 等中按名称引用查询时,此类字符可能会导致各种麻烦。 修复了名称 - 并且工作愉快 - 感谢您的帮助!是的,我已经意识到它会导致各种各样的问题,文件名、Excel 工作表名称等。

以上是关于使用 VBA 或 PowerShell 将所有 MS Access SQL 查询导出到文本文件的主要内容,如果未能解决你的问题,请参考以下文章

原创利用Office宏实现powershell payload远控

使用 PowerShell 复制没有文件的文件夹、没有文件夹的文件或所有内容

在 VBA 访问中运行 powershell

Excel Vba。将 [m] 格式转换为通用格式

VBA Excel 2016 中未定义子或函数

powershell 这将遍历站点中的所有子站点,并且添加组可设置组的权限。打破或重置的好例子