我在 MS-Access 中工作有很多 SQL,我需要对其进行格式化,以便人类可读。问题是,当我在视图之间进行更改时,最终 SQL 会被压缩成我无法读取的内容。
当我转到其他视图时,如何强制 SQL 保留其“形状”?
我发现了一个黑客,这里。秘密在于将您的查询包含在虚拟查询中。像这样:
SELECT * FROM (SELECT <-----here
Table1.Field1,
Table1.Field2
FROM
Table1
WHERE
Table1.Field2 = "Yes") AS query1 <-----here
我已经指出了代码的封装位置和方式。我能看到的唯一问题是,如果您想在设计视图中编辑代码,那么它似乎根本不会选择包含的代码。
如果您拥有 PC 的管理员访问权限(安装所需),Access SQL 编辑器可能是正确的工具。
我从未使用过它:作为顾问,我很少有权在我使用的机器上安装东西,但它看起来与我想要的一模一样:SSMS 编辑器的复制品。
有时,@Pureferret 提出的方法可能会失败,因为 Access 不断重新格式化 SQL。
我发现始终有效的唯一方法是附加一个
UNION ALL
块
在查询末尾。UNION ALL
,它甚至不会建议在设计模式下进行编辑。UNION
但出现 Overflow
错误!)
SELECT
...
...
FROM
...
WHERE
...
UNION ALL SELECT NULL, NULL, NULL FROM ANY_TABLE WHERE NULL
(如果您对目标真实表感到困扰,可以使用“双”表到数据库)
此外,我发现只在末尾添加一行有点“干净”。
但您需要编写与实际查询中所选字段一样多的
NULL
。
编辑:/!\ 在子查询中小心使用此方法,因为它可能会在使用它的查询中导致一些
Query too complex
错误! :(
这不会保留格式,但可以重新格式化。
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
您可以使用上面的代码,使用 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
我在工作中大量使用 SQL Server,但在家里我保留了 20 个个人数据库,所以每天我都看到这两个世界。 我修改了一个做法,它是我在 Access 中经常使用的主力:
在设计视图中完成我可以执行的任何快速操作后,我复制到记事本并从那里优化查询。
事实上,我在一个名为“QueryArchive”的表中对记录进行版本控制,我将要修改的任何查询的起始副本放在其中。我设计了该表,以便记录带有时间戳,有评论(我所做的工作,我稍后需要写的内容等),并有一个是/否框来指示版本是否进入“prod”(即,如果我实际上将该代码版本复制到其执行它的命名 Access 查询中)。
简而言之,我使用设计视图进行快速配置调整,但使用记事本进行繁重的开发——记事本和我的表 QueryArchive 保留格式。
尽管我尽了最大的编码努力,但仍然会有最复杂的项目,其中设计视图会搞砸——这就是我保持这种做法的原因之一:我可以无休止地以未更改的格式提取初始代码的新副本。
另一个原因?这种做法非常简单:没有代码 mod!