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 表
如何使用 MS Access 2016 在 VBA 表达式中编写数字字段?