如何强制 MS Access 保留其 SQL 格式?

问题描述 投票:0回答:6

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

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

sql ms-access code-formatting
6个回答
12
投票

我发现了一个黑客,这里。秘密在于将您的查询包含在虚拟查询中。像这样:

SELECT * FROM (SELECT   <-----here
Table1.Field1,
Table1.Field2
FROM
Table1

WHERE
Table1.Field2 = "Yes") AS query1 <-----here

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


4
投票

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


3
投票

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

我发现始终有效的唯一方法是附加一个

UNION ALL
块 在查询末尾。
事实上,由于 Access 不处理
UNION ALL
,它甚至不会建议在设计模式下进行编辑。
(我尝试过
UNION
但出现
Overflow
错误!)

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

(如果您对目标真实表感到困扰,可以使用“双”表到数据库)

此外,我发现只在末尾添加一行有点“干净”。
但您需要编写与实际查询中所选字段一样多的

NULL

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

Query too complex
错误! :(


0
投票

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

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

0
投票

您可以使用上面的代码,使用 Poor Man's T-SQL formatter .NET 3.5 库(在 Access 中注册它)来格式化您的 SQL 代码,然后就可以了

Dim sQry As String
Dim oSQLMgr As New PoorMansTsqlFormatterLib35.SqlFormattingManager
sQry=Replace(oSQLMgr.Format(CurrentDB.QueryDefs("MyQueryName")),vbTab,"    ")

然后将其粘贴到您的查询中。也可以像这样自动化:

Dim clp As New MSForms.DataObject
clp.SetText sQry
clp.PutInClipboard
DoCmd.OpenQuery "MyQueryName", acViewDesign, acEdit
DoCmd.RunCommand acCmdSQLView
DoCmd.RunCommand acCmdPaste 

0
投票

我在工作中大量使用 SQL Server,但在家里我保留了 20 个个人数据库,所以每天我都看到这两个世界。 我修改了一个做法,它是我在 Access 中经常使用的主力:

在设计视图中完成我可以执行的任何快速操作后,我复制到记事本并从那里优化查询。

事实上,我在一个名为“QueryArchive”的表中对记录进行版本控制,我将要修改的任何查询的起始副本放在其中。我设计了该表,以便记录带有时间戳,有评论(我所做的工作,我稍后需要写的内容等),并有一个是/否框来指示版本是否进入“prod”(即,如果我实际上将该代码版本复制到其执行它的命名 Access 查询中)。

简而言之,我使用设计视图进行快速配置调整,但使用记事本进行繁重的开发——记事本和我的表 QueryArchive 保留格式。

尽管我尽了最大的编码努力,但仍然会有最复杂的项目,其中设计视图会搞砸——这就是我保持这种做法的原因之一:我可以无休止地以未更改的格式提取初始代码的新副本。

另一个原因?这种做法非常简单:没有代码 mod!

© www.soinside.com 2019 - 2024. All rights reserved.