我确定它很简单,但是,我在尝试运行时遇到错误 . 我创建了一个数据库,想要导入一些数据 . 我已经解析了导入文件,并将相关数据分配给变量 .
下一步是插入我已经管理过的数据库,但是,如果发现重复,我希望忽略该行 .
代码是: -
strSQL = "INSERT INTO PubHol " & "(HolidayDate, HolidayName)" & " VALUES (""" & dtOutDT & """, """ & strOutDesc & """ )" & " WHERE NOT EXISTS (SELECT * FROM PubHol as ph WHERE ph.HolidayDate = CDate ('" & dtOutDT & "'))"
MsgBox strSQL
dbCurr.Execute strSQL, dbFailOnError
MsgBox显示以下输出: -
---------------------------
Microsoft Access
---------------------------
INSERT INTO PubHol (HolidayDate, HolidayName) VALUES ("01/01/2018", "New Year's Day" ) WHERE NOT EXISTS (SELECT * FROM PubHol as ph WHERE ph.HolidayDate = CDate ('01/01/2018'))
所有这些对我来说似乎都是一个有效的SQL语句,但我得到了一个VB错误
运行时错误'3067'查询输入必须至少包含一个表或查询 .
任何人都可以解释我出错的地方吗?
或者有关避免重复添加到我的数据库的任何其他提示?
谢谢
2 回答
您不能将
INSERT INTO .. VALUES
语法与WHERE
子句一起使用 . (我猜这是因为WHERE
旨在限制插入的记录,这只有在您尝试插入多个记录时才有意义; Access SQL中的VALUES
会插入一条记录 . )理想情况下,您应该应用约束并处理生成的错误,如Parfait's answer .
如果你不能这样做,(因为约束只适用于导入而不是常规业务数据,或者出于其他原因),那么要么决定是否
INSERT
在VBA中记录,而不是在SQL中:或者,如果您仍想在SQL中完全执行此操作,我建议如下:
dummy
是数据库中至少有一条记录的任何表 .NB . 您可能想要考虑使用SQL参数;您可以避免必须手动构造字符串和日期文字,并避免在查询中进行日期转换 .
此外,您似乎一次只导入一条记录 . 如果您可以为导入源创建链接表,则最好创建一个
INSERT
查询,该查询会将链接表中的数据按到正确的目标表形状中 .在Access SQL方言中,如果没有查询中的数据源,则无法运行
WHERE
. 具体而言,您可以在HolidayDate和HolidayName上禁用重复项的唯一值约束:然后运行常规参数化追加查询,其中任何添加重复值的尝试都将作为异常返回并回滚 .
SQL (另存为查询对象,可用于其他假期)
VBA