访问VBA SQL运行时错误“3075”语法错误

访问VBA SQL运行时错误“3075”语法错误

问题描述:

我试图运行此代码,但它给我的错误信息:访问VBA SQL运行时错误“3075”语法错误

运行时错误“3075”; “查询表达式中的语法错误(缺少运算符)”

我该如何解决此错误?

我想插入CellNumber是在表1但不是在变量表到ERROR日期时间,字符串和CellNumber

Dim sqlstr As String 

sqlstr = "SELECT CellNumber FROM table1 WHERE CellNumber NOT IN (SELECT CellNumber FROM Variable)" 

DoCmd.RunSQL "INSERT INTO ERROR ([DateTime], RowNum, Error) SELECT Now(), 'string' as RowNum, CellNumber FROM(" & sqlstr & ")" 
+0

另外,使用NOT EXISTS而不是NOT IN会更好吗?或者它在速度上相似? – Den

+0

您尝试运行的结果SQL是: INSERT INTO ERROR([DateTime],RowNum,Error)SELECT Now(),'string'as RowNum,CellNumber FROM(SELECT CellNumber FROM table1 WHERE CellNumber NOT IN(SELECT CellNumber FROM Variable)) 我认为你的问题在于 “,CellNumber FROM(SELECT CellNumber FROM” – KacireeSoftware

+0

所以你要做的就是找到Table1中不存在于变量表中的所有单元格?然后将它们插入Error表? – KacireeSoftware

Dim sqlstr As String 
    sqlstr = "INSERT INTO Error ([DateTime],RowNum, Error) " & _ 
      "SELECT Now() , 'String' , table1.cellnumber FROM table1 " & _ 
      "LEFT JOIN Variable ON table1.cellnumber = Variable.cellnumber " & _ 
      "WHERE Variable.cellnumber Is Null" 
    currentdb.execute sqlstr, dbfailonerror 

我就是这么做的

编辑------ 我想补充为后人几点意见:

  1. 我会亲自把我的日期时间戳字段的Now()默认值,并从我的SQL忽略它总共......所有新记录都会得到时间戳,并且出错的空间更小。
Dim sqlstr As String 
     sqlstr = "INSERT INTO tblError (StringField, CellNumber) " & _ 
       "SELECT 'String' , table1.cellnumber FROM table1 " & _ 
       "LEFT JOIN table2 ON table1.cellnumber = table2.cellnumber " & _ 
       "WHERE table2.cellnumber Is Null" 
     currentdb.execute sqlstr, dbfailonerror 
  1. 我绝不会使用DateTimeError,或Variable作为表或字段的名称,因为即使访问可以处理它(通过限定保留名称为[DateTime],适用于Instance),但在尝试排除代码和sql故障时可能会造成混淆和误导。
开始=>
+0

作为一个方面说明:我会亲自避免使用'error'和'DateTime'作为字段或表名 – KacireeSoftware

+1

@Parfait我同意。我想他只是在这里使用一些通用名称来获得他的SQL权利。 – KacireeSoftware