脚本输出并将MS Access宏导出到SQL

时间:2016-09-27 14:51:59

标签: sql-server excel vba ms-access macros

我有几十种形式的宏:

enter image description here

我想要做的是在SQL中编写整个宏的脚本。我知道这可以通过打开查询并选择SQL View手动完成。 例如,第一个查询Build BOM - Part 0A,如果已打开并选择SQL view,则会显示:

DELETE FROM [BOM Cost];

有没有办法为整个宏自动完成此操作而无需进入每个查询和宏?

2 个答案:

答案 0 :(得分:1)

您可以使用VBA代码获取(至少某些)您需要的内容。例如,您可以使用

遍历当前数据库中的所有宏
Dim m As Object
For Each m In CurrentProject.AllMacros
    Dim macroName As String
    macroName = m.Name
    Debug.Print macroName
Next

现在,您可以将其转储到带有

的文本文件中,而不是简单地打印宏名称
Application.SaveAsText acMacro, macroName, "C:\Users\Gord\Desktop\macroDump.txt"

将产生一个看起来像这样的文件

Version =196611
PublishOption =1
ColumnsShown =0
Begin
    Action ="OpenQuery"
    Argument ="MyUpdateQuery"
    Argument ="0"
    Argument ="1"
End
Begin
    Comment ="_AXL:<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"no\"?>\015\012<UserI"
        "nterfaceMacro MinimumClientDesignVersion=\"14.0.0000.0000\" xmlns=\"http://schem"
        "as.microsoft.com/office/accessservices/2009/11/application\" xmlns:a=\"http://sc"
        "hemas.microsoft.com/office/acc"
End
Begin
    Comment ="_AXL:essservices/2009/11/forms\"><Statements><Action Name=\"OpenQuery\"><Argumen"
        "t Name=\"QueryName\">MyUpdateQuery</Argument></Action></Statements></UserInterfa"
        "ceMacro>"
End

然后,您可以解析该文件,查找包含Action ="OpenQuery"的Begin / End块并检索查询名称。有了它,您可以打开QueryDef对象并检索其SQL

Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim qdf As DAO.QueryDef
Set qdf = cdb.QueryDefs(queryName)  ' MyUpdateQuery
Dim querySql As String
querySql = qdf.SQL

答案 1 :(得分:0)

虽然没有完全自动化并且类似于@ GordThompson的建议,但考虑将每个宏中的所有查询名称手动收集到VBA数组中,然后遍历QueryDefs集合,将每个查询名称写入不断增长的文件:

Public Sub ExtractSQL()
    Dim db As DAO.Database, qdef As DAO.Querydef
    Dim qrys As Variant, qry As Variant
    Dim strSQL As String, sqlFile As String

    Set db = CurrentDb        
    qrys = Array("Query1", "Query2", "Query3")

    sqlFile = "C:\Path\To\AllQueries.sql"

    ' OPEN SQL TEXT FILE
    Open sqlFile For Output As #1

    For Each qdef In db.QueryDefs        
        For Each qry In qrys

            If qdef.Name = qry Then                                    
                    Print #1, qdef.SQL      ' SQL STATEMENT
                    Print #1, ""            ' LINE SEPARATOR                    
            End If

        Next qry
    Next qdef

    ' CLOSE SQL TEXT FILE
    Close #1
    Set qdef = Nothing
    Set db = Nothing

End Sub

请注意:Access SQL在SQL Server的T-SQL中并不容易兼容。这两种方言略有不同。因此,需要进行一些翻译,包括IIF()CASE(如果在2012年之前使用SQL Server);不使用双引号括起字符串文字;没有交叉点枢轴;和其他项目。