在 MS Access 中管理和调试 SQL 查询

Posted

技术标签:

【中文标题】在 MS Access 中管理和调试 SQL 查询【英文标题】:Managing and debugging SQL queries in MS Access 【发布时间】:2010-09-29 22:58:24 【问题描述】:

MS Access 管理原始 SQL 查询的能力有限:编辑器很糟糕,没有语法高亮,它会将原始 SQL 重新格式化为长字符串,并且无法插入 cmets。

调试复杂的 SQL 查询也很痛苦:要么您必须将其拆分为许多较小的查询,当架构更改时这些查询变得难以管理,或者您最终得到一个巨大的查询,这是调试和更新的噩梦。

您如何在 MS Access 中管理复杂的 SQL 查询以及如何调试它们?

编辑 目前,我主要使用Notepad++ 进行一些语法着色,使用SQL Pretty Printer 重新格式化来自Access 的原始SQL。 使用外部存储库很有用,但始终存在使两个版本不同步的风险,并且您仍然必须在 Access 中尝试查询之前删除 cmets...

【问题讨论】:

我想知道您是否在询问逻辑错误而不是语法错误。这与确定我的方法有关。 【参考方案1】:

为了调试,我在一个单独的文本编辑器中编辑它们,这样我可以合理地格式化它们。当我发现需要进行更改时,我会在文本编辑器中编辑版本,然后将其粘贴回 Access,而不是在 Access 中编辑版本。

仍然是主要的 PITA。

【讨论】:

【参考方案2】:

如果您在 MS Access 中执行非常复杂的查询,我会考虑将这些查询的存储库保存在 Access 数据库本身之外的某个位置...例如,在 .sql 文件中,然后您可以在编辑器中进行编辑像将提供语法高亮的 Intype。它需要您在这两个地方更新查询,但您最终可能会发现有一个“官方”位置很方便,它的格式和突出显示正确。

或者,如果可能的话,切换到 SQL Server 2005 Express Edition,它也是免费的,将通过 SQL Management Studio 为您提供所需的功能(也是免费的)。

【讨论】:

【参考方案3】:

类似于递归,我使用外部编辑器来编写我的查询。我使用带有 Light Explorer 扩展的 Notepad++ 来一次维护多个脚本,而 Notepad2 用于一次性脚本。 (我有点偏爱基于 Scintilla 的编辑器。)

另一种选择是使用 SQL Server Express 随附的免费 SQL Server Management Studio Express。 (编辑:抱歉,EdgarVerona,我没有注意到你已经提到过这个!)我通常使用它来编写 SQL 查询而不是使用 Access,因为我通常使用 ODBC无论如何链接到 SQL Server 后端。请注意,SQL Server 使用的 T-SQL 和 Access MDB 使用的 Jet SQL 的语法差异有时很大。

【讨论】:

【参考方案4】:

调试更具挑战性。如果单列关闭,通常很容易修复。但我假设您需要执行更复杂的调试任务。

当我感到困惑时,我通常使用FROM 子句开始调试。我回溯到构成较大查询的所有表和子查询,并确保正确定义了连接。

然后我检查我的WHERE 子句。我对表以及我已经检查过或我已经信任的子查询运行了许多简单的查询,并确保当我运行更大的查询时,我得到了我对 @987654323 的期望@条件到位。我同时仔细检查了JOIN 条件。

我仔细检查了我的列定义,以确保我正在检索我真正想要查看的内容,尤其是在所涉及的公式很复杂的情况下。如果您在列定义中有诸如协调子查询之类的复杂内容

然后我检查我是否正确分组数据,确保没有UNION ALL 的“DISTINCT”和“UNION”不会删除必要的重复项。

我认为我从来没有遇到过不能以这种方式分解的 SQL 查询。我并不总是像这样有条不紊,但这是开始打破一个真正的障碍的好方法。


当您编写查询时,我可以推荐的一件事是:切勿在生产代码中使用SELECT * 以这种方式选择所有列是一场维护噩梦,当您的底层架构发生变化。如果您正在编写将来要维护的 SQL 代码,则应该始终写出每一列。只需在我的项目中删除“SELECT *”,我就为自己节省了很多时间和担心。

这样做的缺点是这些额外的列不会自动出现在引用“SELECT *”查询的查询中。但无论如何,您应该知道您的查询是如何相互关联的,如果您需要额外的列,您可以返回并添加它们。


维护代码存储库会有些麻烦,但如果您有版本控制软件,那么麻烦就值得了。我听说过用 Access 数据库编写的 SQL 代码版本控制方法,但不幸的是,我从未使用过它们。

【讨论】:

【参考方案5】:

您是在谈论 MS-Access 调用的“查询”和 SQL 调用的“视图”还是 SQL 查询的“MS-Access pass-through”查询?有人很容易迷路!我的解决方案如下

    免费的 SQL Server 管理 Studio Express,我将在哪里 详细说明并测试我的查询 客户端上的查询表 一侧,一个字段用于查询 姓名 (id_Query) 和另一个 (queryText,备忘录类型) 查询自己。

然后,我的 VBA 代码中有一个小函数 getSQLQuery,当我需要执行查询时使用(无论是否返回记录集):

Dim myQuery as string, _
    rsADO as ADODB.recorset

rsADO = new ADODB.recordset
myQuery = getSQLQuery(myId_Query)

'if my query retunrs a recordset'
set rsADO = myADOConnection.Execute myQuery
'or, if no recordset is to be returned'
myADOConnection.Execute myQuery

对于视图,甚至可以将它们保存在服务器端并从客户端引用它们

set rsADO = myADOConnection.execute "dbo.myViewName"

【讨论】:

【参考方案6】:

我有一些专门针对 VBA 中的 SQL 的技巧。

将您的 SQL 代码与字符串变量放在一起。我曾经这样做过:

Set RS = DB.OpenRecordset("SELECT ...")

这很难管理。改为这样做:

strSQL = "SELECT ..."
Set RS = DB.OpenRecordset(strSQL)

通常您无法修复查询,除非您看到正在运行的内容。为此,请在执行前将您的 SQL 转储到即时窗口:

strSQL = "SELECT ..."
Debug.Print strSQL
Stop
Set RS = DB.OpenRecordset(strSQL)

将结果粘贴到 Access 的标准查询生成器中(您必须使用 SQL 视图)。现在您可以测试最终版本,包括代码处理的变量。

当你准备一个长查询作为字符串时,分解你的代码:

strSQL = "SELECT wazzle FROM bamsploot" _
      & vbCrLf & "WHERE plumsnooker = 0"

我第一次学会使用vbCrLf 是为了给用户美化长消息。后来我发现它使 SQL 在编码时更具可读性,并且改进了 Debug.Print 的输出。 (其他微小的好处:每行末尾不需要空格。新的行语法构建了它。)

(注意:您可能认为这会让您在 SQL 行的右侧添加 add cmets。准备好失望吧。)

正如这里其他地方所说,使用文本编辑器可以节省时间。一些文本编辑器提供比官方 VBA 编辑器更好的语法突出显示。 (哎呀,*** 做得更好。)它也可以有效地删除 Access 杂乱无章的东西,比如 WHERE 子句中多余的表引用和成堆的括号。

解决严重问题的工作流程:

VBA Debug.Print >       (capture query during code operation)
  query builder   >     (testing lab to find issues)
     Notepad++      >   (text editor for clean-up and review)
  query builder   >     (checking, troubleshooting) 
VBA

当然,故障排除通常是降低查询的复杂性,直到您能够隔离问题(或至少使其消失!)。然后,您可以将其重新构建为您想要的杰作。因为解决一个棘手的问题可能需要几个周期,所以您可能会重复使用此工作流程。

【讨论】:

【参考方案7】:

扩展 Smandoli 的建议:

NO:   DoCmd.RunSQL ("SELECT ...")
YES:  strSQL = "SELECT ..."
      DoCmd.RunSQL (strSQL)

如果您想将 SQL 代码保存在外部文件中,以便使用您最喜欢的文本编辑器(带有语法着色等)进行编辑,您可以执行以下伪代码:

// On initialization:
global strSQL
f = open("strSQL.sql")
strSQL = read_all(f)
close(f)

// To to the select:
DoCmd.RunSQL(strSQL)

这可能有点笨拙——也许很笨拙——但它避免了编辑-复制-粘贴的一致性问题。

显然这并不能直接解决调试 SQL,但以可读的方式管理代码是问题的一部分。

【讨论】:

【参考方案8】:

我写了Access SQL Editor——Microsoft Access 的一个插件——因为我在 Access 中编写了相当多的传递查询和更复杂的 SQL。此加载项的优点是能够在您的 Access 应用程序本身中存储格式化的 SQL(使用 cmets!)。将查询复制到新的 Access 应用程序时,会保留格式。当内置编辑器破坏您的格式时,该工具将显示您的原始查询并通知您其中的差异。

目前不调试;如果有足够的兴趣,我会追求这个——但目前有意将功能集保持在较小的范围内。

暂时不是免费的,但是purchasing一个license很便宜。如果买不起,可以contact me。有一个免费的 14 天试用版here。

安装后,您可以通过加载项菜单访问它(在 Access 2010 中,它是数据库工具->加载项)。

【讨论】:

当我问这个问题时,你的插件完全符合我的想法。它对调试没有直接帮助,但有助于使 SQL 查询可维护。 (完全披露:@transistor1 在我试用插件后给了我一个许可证)。 非常感谢 - 这非常有帮助!【参考方案9】:

据我所知,有两种选择:

带有可怜人的 t-sql 格式化程序插件的 Notepad++ ..我知道已经提到了 SQL Pretty Printer 但我没有使用它..所以我的工作流程是..我在 Access 中创建查询..我复制将其粘贴到记事本++ ...我对其进行格式化..我正在处理它...返回 Access..仅问题..在某些情况下它会填充空格:[Forms]![AForm].[Ctrl] 和他们变成了[表格]! [AForm].[Ctrl] 但我习惯了它并没有打扰我.. SoftTree SQL 助手 (http://www.softtreetech.com/sqlassist/index.htm) 几乎可以在 SQL 编辑器上提供您想要的一切......我过去曾做过一些工作(试用版),但它的价格标签有点僵硬

【讨论】:

以上是关于在 MS Access 中管理和调试 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MS Access 2007 中获取 sql 查询

在 sql (MS-Access) 中编写分组查询

MS Access/SQL 子查询的语法,包括聚合函数

插入查询中发生语法错误(MS Access)

使用 SQL 在 Ms-access 查询中运行 Total

SQL 查询和 MS Access 查询返回不同的数据