MS Access - 在 VBA 中编写 SQL

Posted

技术标签:

【中文标题】MS Access - 在 VBA 中编写 SQL【英文标题】:MS Access - Writing SQL in VBA 【发布时间】:2016-10-25 21:52:57 【问题描述】:

背景

开发一个 MS Access 模块,在 onClick() 事件触发时执行 SQL 代码。

代码

Dim sqlString As String

sqlString = "SELECT [Table - Summary - All Item Forecasts, Sales, and POs].[COMPANY ID], " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].[COMPANY NAME], " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].ITEM, " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].STYLE, " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].DESCRIPTION, " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].[SALE PRICE], " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].[ON-HAND QTY], " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].[FORECAST QTY], " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].[MaxOfLATEST PO DATE] " _
    & "FROM [Table - Active Product Catalog] " _
    & "LEFT JOIN [Table - Summary - All Item Forecasts, Sales, and POs] " _
        & "ON [Table - Active Product Catalog].STYLE = [Table - Summary - All Item Forecasts, Sales, and POs].STYLE " _
    & "GROUP BY [Table - Summary - All Item Forecasts, Sales, and POs].[COMPANY ID], " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].[COMPANY NAME] , " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].Item, " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].Style, " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].Description, " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].[SALE PRICE], " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].[ON-HAND QTY], " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].[FORECAST QTY], " _
        & "[Table - Summary - All Item Forecasts, Sales, and POs].[MaxOfLATEST PO DATE]" _
    & "HAVING ((([Table - Summary - All Item Forecasts, Sales, and POs].[COMPANY NAME]) Like ' * ' & [Enter Company Name:] & ' * '));"


DoCmd.RunSQL sqlString

错误

运行时错误“2342”:RunSQL 操作需要一个由 SQL 语句组成的参数。

问题

    我已按照以下tutorial 操作,但收到错误消息。 RunSQL 命令似乎没有将 sqlString 识别为 SQL 命令。但是,我很肯定 SQL 语句在 MS Access 中正确运行。有什么想法吗? 在 SQL 语句的最后一行,我有一个 MsgBox 提示符(“[Enter Company Name:]”)。我不太确定这是否会影响 SQL 语句,但如前所述,该语法在 MS Access 中运行;即使我用硬编码值替换提示,我也会收到相同的错误消息。

注意:我很可能会创建一个 inputBox 来请求 company name,然后将变量放在 SQL 语句的最后一行。

【问题讨论】:

见这里:***.com/questions/27421873/… 考虑在你的 SQL (SELECT Summary.[COMPANY ID] FROM [Table - Summary - All Item Forecasts, Sales, and POs] AS Summary) 中使用表别名;它会让你的语句更短更容易解析。 【参考方案1】:

如 DoCmd.RunSQL documentation 中所述,它用于运行“操作查询”。也就是说,SQLStatement

对于操作查询或数据定义查询而言,它是有效的 SQL 语句的字符串表达式。它使用 INSERT INTO、DELETE、SELECT...INTO、UPDATE、CREATE TABLE、ALTER TABLE、DROP TABLE、CREATE INDEX 或 DROP INDEX 语句。

请注意,上面的列表包括SELECT...INTO,但不包括普通的SELECT。要执行一个普通的SELECT 并返回一个记录集,您需要执行类似的操作

Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim rst As DAO.Recordset
Set rst = cdb.OpenRecordset(sqlString, dbOpenSnapshot)
' loop through the Recordset contents

【讨论】:

【参考方案2】:

另外,在最后 2 行中,您缺少 ...[MaxOfLATEST PO DATE] 和 HAVING 之间的空格。当它尝试将其作为 SQL 运行时,它会崩溃。 我自己打过几次,因为我对 VBA 很陌生 - 我总是在运行命令之后放置一个 debug.print SQLstring,因为在立即窗口中更容易找到这些缺失的空格等。

HTH,珍妮

【讨论】:

以上是关于MS Access - 在 VBA 中编写 SQL的主要内容,如果未能解决你的问题,请参考以下文章

MS ACCESS, VBA 将外部 MS Access 表导入 SQL server 表

VBA 代码中的 MS Access SQL 查询

如何使用 MS Access 2016 在 VBA 表达式中编写数字字段?

MS Access VBA SQL查询调试选择案例

编辑器中的 ms-access VBA 长 sql 查询字符串行拆分(内联双引号)

MS Access:如何找到 VBA 函数的所有用法?