2017-10-17 113 views
0

我試圖運行此代碼,但它給我的錯誤信息:訪問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

回答

1
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 
  • 我絕不會使用DateTimeError,或Variable作爲表或字段的名稱,因爲即使訪問可以處理它(通過限定保留名稱爲[DateTime],適用於Instance),但在嘗試排除代碼和sql故障時可能會造成混淆和誤導。
  • +0

    作爲一個方面說明:我會親自避免使用'error'和'DateTime'作爲字段或表名 – KacireeSoftware

    +1

    @Parfait我同意。我想他只是在這裏使用一些通用名稱來獲得他的SQL權利。 – KacireeSoftware