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

在MS Access中管理和调试SQL查询,sql,debugging,ms-access,Sql,Debugging,Ms Access,MS Access管理原始SQL查询的能力有限:编辑器非常糟糕,没有语法突出显示,它将原始SQL重新格式化为长字符串,并且不能插入注释 调试复杂的SQL查询也是一件痛苦的事情:要么您必须将其拆分为许多较小的查询,当您的模式发生更改时,这些查询将变得难以管理,要么您最终得到一个巨大的查询,这是调试和更新的噩梦 如何在MS Access中管理复杂的SQL查询,以及如何调试它们 编辑 目前,我主要只是使用一些语法着色,并合理地重新格式化Access中的原始SQL。 使用外部存储库很有用,但保持两个版本

MS Access管理原始SQL查询的能力有限:编辑器非常糟糕,没有语法突出显示,它将原始SQL重新格式化为长字符串,并且不能插入注释

调试复杂的SQL查询也是一件痛苦的事情:要么您必须将其拆分为许多较小的查询,当您的模式发生更改时,这些查询将变得难以管理,要么您最终得到一个巨大的查询,这是调试和更新的噩梦

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

编辑
目前,我主要只是使用一些语法着色,并合理地重新格式化Access中的原始SQL。

使用外部存储库很有用,但保持两个版本不同步的风险始终存在,在Access中尝试查询之前,您仍然必须删除注释…

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


仍然是一个主要的PITA。

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


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

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


另一种选择是使用免费的SQLServerManagementStudio Express,它是SQLServerExpress附带的。(编辑:抱歉,EdgarVerona,我没有注意到您已经提到了这一点!)我通常使用它来编写SQL查询,而不是使用Access,因为我通常使用ODBC链接到SQL Server后端。请注意,SQL Server使用的T-SQL和Access MDB使用的Jet SQL在语法上的差异有时很大。

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

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

然后我检查我的
WHERE
子句。我对表和我已经检查过的子查询或我已经信任的子查询运行了很多简单的查询,并确保在运行较大的查询时,我得到了我所期望的
WHERE
条件。我同时仔细检查了
JOIN
条件

我仔细检查我的列定义,以确保检索到我真正想要看到的内容,特别是当涉及的公式很复杂时。如果在列定义中有一个复杂的子查询

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

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


在编写查询时,我可以建议您这样做:不要在生产代码中使用
SELECT*
以这种方式选择所有列是维护的噩梦,并且在基础架构更改时会导致大问题。如果您正在编写将来要维护的SQL代码,那么应该始终写出每一列。我在项目中去掉了“
SELECT*
”,节省了很多时间和担心

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



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

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

  • 免费SQL Server管理 工作室快车,我要去的地方 详细说明并测试我的查询
  • 客户端上的查询表 侧,带有一个用于查询的字段 名称(
    id\u Query
    )和另一个 (
    queryText
    ,备忘录类型)用于 查询本身
  • 然后,在我的VBA代码中有一个小函数
    getSQLQuery
    ,当我需要执行查询(返回或不返回记录集)时使用:

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

    set rsADO = myADOConnection.execute "dbo.myViewName"
    

    我有一些特定于VBA中SQL的技巧

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

    DoCmd.RunSQL "SELECT ..."
    
    这很难管理。改为这样做:

    strSQL = "SELECT ..."
    DoCmd.RunSQL strSQL
    
    通常,除非看到正在运行的内容,否则无法修复查询。要做到这一点,请扔掉你的SQ
    strSQL = "SELECT ..."
    DoCmd.RunSQL strSQL
    
    strSQL = "SELECT ..."
    Debug.Print strSQL
    Stop
    DoCmd.RunSQL strSQL
    
    strSQL = "SELECT wazzle FROM bamsploot" _
          & vbCrLf & "WHERE plumsnooker = 0"
    
    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
    
    NO:   DoCmd.RunSQL ("SELECT ...")
    YES:  strSQL = "SELECT ..."
          DoCmd.RunSQL (strSQL)
    
    // On initialization:
    global strSQL
    f = open("strSQL.sql")
    strSQL = read_all(f)
    close(f)
    
    // To to the select:
    DoCmd.RunSQL(strSQL)