【发布时间】:2011-08-02 13:59:05
【问题描述】:
我在 excel 中有一个子例程,我想将数据写入 Access 表。如果表中的行已经存在,我正在尝试更新它,如果不存在则添加它。从 Jeremiah Clark 在这个 MSDN 博客上给出的 suggestion 开始,我有我的查询,我将从我的 Excel 的 VBA 子例程中执行:
UPDATE tblName
SET [Column1] = 'text', ...(other values)... [ColumnN] = 1234
WHERE ([Column1] = 'text' AND [Column2] = 'text2')
If @@ROWCOUNT = 0
INSERT INTO tblName
VALUES ( [Column1] = 'text', ...(other values)... [ColumnN] = 1234 )
它给我的错误是:
Syntax error (missing operator) in query expression '([Column1] = 'text' AND [Column2] = 'text2')
If @@ROWCOUNT = 0
INSERT INTO tblName
VALUES ( [Column1] = 'text', ...(other values)...'.
我对 SQL 还很陌生,但尝试了各种将 IF 行括起来(括号括起来)的方法,以防评估顺序不是我所期望的,但这无济于事。查询的第一部分是否没有被评估,因此@@ROWCOUNT 不能正确执行?
Edit1:如果重要,请使用 Access 2003。
解决方案: 基于bluefeet's suggestion(查看他的完整回复):
objDB.Execute sqlStrSelect
recordset.Source = sqlStrSelect
recordset.Open , , adOpenDynamic, adLockOptimistic
If recordset.Fields(0) = 0 Then
objDB.Execute sqlStrInsert
Else
objDB.Execute sqlStrUpdate
End If
这依赖于修改后的 SELECT 查询来让 Access 返回记录的计数:
sqlStrSelect = "SELECT Count(id) FROM table1 WHERE id = 3"
HansUp 正确地推测我正在使用 ADO 连接,因此执行代码的方式必须与 bluefeet 最初建议的方式不同。
【问题讨论】:
-
我认为这不适用于 Access。我猜它适用于 SQL Server。
-
@cularis - 是否有资源可以让我查看 SQL Access 2003 使用的版本和/或 Access 2003 中有效的命令和表达式?
-
尝试重构查询:
IF EXISTS(SELECT * FROM tbl WHERE blah) UPDATE blah ELSE INSERT blah -
@@ROWCOUNT 在 MS Access 中不存在。你提到的那个博客是在谈论 SQL Server 而不是 Access。