使用 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远控