【问题标题】:VBA: SELECT statement run-time errorVBA:SELECT 语句运行时错误
【发布时间】:2016-01-25 23:46:53
【问题描述】:
Private Sub CmdPharmacy_Click()

Dim myM(11) As String

Set mydb = CurrentDb

If PMNM = "" Then
    PMNM = UCase(Left(cboMonth.Value, 3))
End If

sQ = "SELECT mN FROM PharDate WHERE mT = '" & PMNM & "';"
Set myrec = mydb.OpenRecordset(sQ, dbOpenDynaset)
myrec.MoveFirst
myC = myrec.Fields("mN")

For i = 0 To myC - 1
    myM(i) = "M" & i + 1
Next i

For i = myC To 11
    myM(i) = "NDATA"
Next i

'mydb.TableDefs.Delete ("PHAR_REPORT")

sQ = "SELECT HistoryData2.PR, HistoryData2.CC, " & _
       "HistoryData2." & myM(0) & " as U1, HistoryData2." & myM(1) & " as U2, HistoryData2." & myM(2) & " as U3, HistoryData2." & myM(3) & " as U4, " & _
       "HistoryData2." & myM(4) & " as U5, HistoryData2." & myM(5) & " as U6, HistoryData2." & myM(6) & " as U7, HistoryData2." & myM(7) & " as U8, " & _
       "HistoryData2." & myM(8) & " as U9, HistoryData2." & myM(9) & " as U10, HistoryData2." & myM(10) & " as U11, HistoryData2." & myM(11) & " as U12," & _
       "Revenue." & myM(0) & " as R1, Revenue." & myM(1) & " as R2, Revenue." & myM(2) & " as R3, Revenue." & myM(3) & " as R4, Revenue." & myM(4) & " as R5, " & _
       "Revenue." & myM(5) & " as R6, Revenue." & myM(6) & " as R7, Revenue." & myM(7) & " as R8, Revenue." & myM(8) & " as R9, Revenue." & myM(9) & " as R10, " & _
       "Revenue." & myM(10) & " as R11, Revenue." & myM(11) & " as R12, " & _
       "INTO PHAR_REPORT FROM HistoryData2, Revenue WHERE (((HistoryData2.PR) = Revenue.PR) And " & _
       "((Revenue.PR)>=76700000 And (Revenue.PR)<=76900000)) ORDER BY HistoryData2.PR;"

当我尝试执行 sQ 时,我收到运行时错误...... SELECT 语句包含拼写错误或缺少的保留字或参数名称,或者标点符号不正确。

SELECT HistoryData2.PR, HistoryData2.CC, HistoryData2.M1 as U1, HistoryData2.M2 as U2, HistoryData2.M3 as U3, HistoryData2.M4 as U4, HistoryData2.M5 as U5, HistoryData2.M6 as U6, HistoryData2.M7 as U7, HistoryData2.M8 as U8, HistoryData2.NDATA as U9, HistoryData2.NDATA as U10, HistoryData2.NDATA as U11, HistoryData2.NDATA as U12 Revenue.M1 as R1, Revenue.M2 as R2, Revenue.M3 as R3, Revenue.M4 as R4, Revenue.M5 as R5, Revenue.M6 as R6, Revenue.M7 as R7, Revenue.M8 as R8, Revenue.NDATA as R9, Revenue.NDATA as R10, Revenue.NDATA as R11, Revenue.NDATA as R12 
   INTO PHAR_REPORT 
FROM HistoryData2, Revenue 
WHERE (((HistoryData2.PR) = Revenue.PR) And ((Revenue.PR)>=76700000 And (Revenue.PR)<=76900000)) 
ORDER BY HistoryData2.PR;

【问题讨论】:

  • @HansUp....我使用了您的建议并且查询有效。但是当我尝试使用完全相同的 SELECT 语句时,我会收到此错误消息或参数太少的错误消息
  • 你是如何执行查询的?你在用 querydef 吗?

标签: ms-access vba


【解决方案1】:

您需要查看您尝试执行的已完成的 SQL 语句。在 mydb.Execute 之前添加一行,如下所示:

Debug.Print sQ
mydb.Execute sQ

Debug.Print 将在即时窗口中打印语句。 (您可以使用 CTRL+g 到达那里。)复制语句,然后打开一个新查询,切换到 SQL 视图并将其粘贴到那里,然后尝试一下。希望这种努力能帮助您识别问题。如果您无法解决它,请编辑您的问题以包含该语句,以便我们也可以看到它。

更新:您的问题的最新版本在您的字段列表中的最后一个字段之后包含一个逗号:

"Revenue." & myM(10) & " as R11, Revenue." & myM(11) & " as R12, " & _

删除 R12 之后的那个逗号。

Update2:David Fenton 在您包含的 SQL 语句中发现了缺少的逗号。我希望缺少的逗号会导致错误 3075,“查询表达式中的语法错误(缺少运算符)......”。但是,您的上一份报告表明您收到的错误消息是“条件表达式中的数据类型不匹配”。我怀疑我们一直在处理一个移动的目标。您至少报告了 3 条不同的错误消息。而且您发布的 SQL 语句与您向我们展示的 VBA 代码不一致。

如果您的错误消息仍然是“条件表达式中的数据类型不匹配”,请尝试此查询并向我们展示它为您提供的信息:

SELECT "HistoryData2" AS table_name, TypeName(PR) AS pr_data_type
FROM HistoryData2
UNION ALL
SELECT "Revenue" AS table_name, TypeName(PR) AS pr_data_type
FROM Revenue;

【讨论】:

  • “参数太少...”是 VBA 在引用 SQL 查询中不存在的字段时所说的。本质上,VBA 期望您传递一个参数来替换查询中的未知值。对于所有这些动态字段名称,其中一个或多个必须无效...
  • @HansUp 现在我收到错误消息 Data type mismatch in criteria expression
  • @Edmond 向我们展示产生该错误的实际 SQL 语句。
  • @Edmond 您的 HistoryData2 和 Revenue 表中 PR 字段的数据类型是什么?
  • @HansUp 数字数据类型。字段大小为双倍。当您说“显示实际的 SQL 语句”时,您指的是什么?
【解决方案2】:

在你的 SQL 语句的 SELECT 子句中你有这个:

HistoryData2.NDATA as U12 Revenue.M1 as R1

应该是这样的:

HistoryData2.NDATA as U12, Revenue.M1 as R1

也就是说,缺少逗号。

但是,我在连接字符串的代码中看到尾随逗号。我无法解释这种差异,除非您更改了代码,或者没有从正确的来源派生 SQL。

【讨论】:

  • 当我尝试执行 sQ 时,我收到一条 INVALID ARGUMENT 错误消息
  • 经过多次反复之后,我们仍然不知道您要执行的具体 SQL 字符串,因为您的代码确实包含逗号,但您的结果报告却没有。除非您作为连接结果发布的内容来自其他地方,否则这不可能是真的。在我们执行实际的 SQL 字符串之前,我们甚至无法开始查看它是否有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 2020-05-26
相关资源
最近更新 更多