【问题标题】:How do I force MS Access to retain its SQL formatting?如何强制 MS Access 保留其 SQL 格式?
【发布时间】:2012-08-13 07:49:05
【问题描述】:

我在 MS-Access 中有很多 SQL 在工作,我需要对其进行格式化以便人类可读。问题是当我在视图之间切换时,我最终会将 SQL 压缩成我无法阅读的内容。

当我转到其他视图时,如何强制 SQL 保持其“形状”?

【问题讨论】:

    标签: sql ms-access code-formatting


    【解决方案1】:

    我发现了一个 hack,here。秘诀在于将您的查询包含在一个虚拟查询中。像这样:

    SELECT * FROM (SELECT   <-----here
    Table1.Field1,
    Table1.Field2
    FROM
    Table1
    
    WHERE
    Table1.Field2 = "Yes") AS query1 <-----here
    

    我已经指出了您在何处以及如何包装代码。我能看到的唯一问题是,如果您想在设计视图中编辑代码,那么它似乎根本不会选择包含的代码。

    【讨论】:

    • 就是这个想法,设计视图构建器会以它认为最好的方式优化 SQL 语句(在我看来并不常见),如果你擅长手动编写 SQL,那就坚持下去,您不需要将您的语句作为派生表括起来,只要您只在SQL模式下查看并且不切换到设计视图,它就不会修改您的语句。
    • @MattDonnan 没错,但我经常发现自己来回晃动。现在,如果我有一个适当的接口来编写 sql...
    • 这个技巧效果很好——但您似乎必须小心只将查询保存在数据表视图中(Access 2010)。与直觉相反,在 SQL 视图中保存查询会清除所有换行符。然而,即使在 SQL 视图中保存,这种 hack 仍然可以防止通常发生的大量 SQL 重新格式化。
    【解决方案2】:

    有时@Pureferret 提出的方法可能会失败,Access 会不断重新格式化 SQL。

    我发现一直有效的唯一方法是附加一个 UNION ALL 块 在查询结束时。
    事实上,由于 Access 不处理 UNION ALLs,它甚至不会建议在设计模式下进行编辑。
    (我尝试过使用UNION,但出现Overflow 错误!)

    SELECT
        ...
        ...
    FROM
        ...
    WHERE
        ...
    UNION ALL SELECT NULL, NULL, NULL FROM ANY_TABLE WHERE NULL
    

    (如果定位一个真实的表困扰你,你可以使用一个“双”表到数据库)

    此外,我发现只在末尾添加一行会更“干净”。
    但是你需要写尽可能多的NULLs,因为在实际查询中选择了字段。

    编辑:/!\ 在子查询中小心使用此方法,因为它可能会在使用它的查询中导致一些Query too complex 错误! :(

    【讨论】:

      【解决方案3】:

      如果您对您的 PC 具有管理员访问权限(安装时需要),Access SQL editor 可能是正确的工具。
      我从未使用过它:作为一名顾问,我很少有权在我使用的机器上安装东西,但它看起来与我想要的完全一样:SSMS 编辑器的复制品。

      【讨论】:

        【解决方案4】:

        这不会保留格式,但可以重新格式化。

        Sub FormatSQL()
        ' self-contained FormatSQL()
        
        ' 1) Takes WHATEVER is in the clipboard:
        ' 2) replaces all comma + space with comma, vbCrLf and 5 spaces,
        ' 3) replaces ALL double-quotes chr(34) with single-quotes
        ' 4) puts result in clipboard
        
        ' CAUTION - This CAN screw up DOUBLED double-quotes (see below)
        
        ' Use to format SQL in MS Access SQL View
        '
        ' Usage:
        ' 1) Copy source to clipboard (Ctrl-a, Ctrl-c)
        ' 2) Run this
        ' 3) Paste to target (Ctrl-v)
        '
        ' Note: Does NOT have a "Done" popup.
        '
        ' To add it Access ribbon, create a function that calls this and
        ' create a macro that calls the function using RunCode.
        '
        ' Ex:
        ' Function FmtSQL()
        '   Call FormatSQL()
        ' End Function
        
        'NOTES: Must enable Forms Library: _
        '   Tools > References > Microsoft Forms 2.0 Object Library
        'or you will get a "Compile error: user-defined type not defined"
        
        Dim indent As String
            indent = "," & vbCrLf & "     "
        
        Dim DataObj As New MSForms.DataObject
        DataObj.Clear   ' may prevent crashes
        
        Dim clip As Variant
        DataObj.GetFromClipboard
        clip = DataObj.GetText
        
        clip = Replace(clip, ", ", indent)
        
        ' Replace ALL double-quote with single-quote
        ' NOTE: This WILL screw up DOUBLED double-quotes, i.e.
        ' "Write ""My name is Paul."" "
        
        clip = Replace(clip, Chr(34), "'")
        
        DataObj.SetText clip
        DataObj.PutInClipboard
        Set DataObj = Nothing
        
        ' Sub FormatSQL()
        End Sub
        

        【讨论】:

        • 它有什么作用?
        • 查看函数中的 cmets。 @Pureferret
        • @Andre 我看到了。我希望 OP 会在答案的非代码部分添加一些示例。
        • 它不打算从程序中调用。 “示例”只是 Access 重新格式化的 SQL,以及带有换行符和 5 个空格缩进的相同查询。
        • 请注意,我对其进行了轻微修改,因此它将所有双引号替换为单引号。因此,关于我 6 月 30 日的评论,现在将是“使用换行符和 5 空格缩进和双引号替换为单引号的相同查询。”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多