【问题标题】:IF @@Rowcount = 0 -- SQL Syntax Error in AccessIF @@Rowcount = 0 -- 访问中的 SQL 语法错误
【发布时间】: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。

标签: sql ms-access syntax


【解决方案1】:

@@ROWCOUNT 用于 SQL Server 而不是 Access,但由于您使用的是 VBA,因此您可以执行类似的操作。基本上将您的 SQL 语句创建为字符串,将您正在检查的值放入其中。然后首先对表运行查询以查看记录是否存在,如果存在则执行UPDATE,如果不存在则执行INSERT。我在 MS Access 2003 中快速测试了它,它可以工作。

Public Sub test()
    Dim sqlStrUpdate As String
    Dim sqlStrSelect As String
    Dim sqlStrInsert As String
    Dim recordSet As recordSet

    sqlStrUpdate = "UPDATE table1 SET Field1 = " & 5 & " WHERE id = 3"

    sqlStrSelect = "SELECT id FROM table1 WHERE id = 3"

    sqlStrInsert = "INSERT INTO table1 (id, Field1, Field2, Field3) VALUES (3, 5, 0, 0)"

    Set recordSet = CurrentDb.OpenRecordset(sqlStrSelect)

    If recordSet.RecordCount > 0 Then
        DoCmd.RunSQL (sqlStrUpdate)
    ElseIf recordSet.RecordCount = 0 Then
        DoCmd.RunSQL (sqlStrInsert)
    End If

End Sub

编辑:正如 HansUp 指出您正在从 Excel 查询,您的代码可能与此类似:

Public Sub test_new()
Dim cDir_Database         As String
Dim DB_Conn               As New ADODB.Connection         'Access Connection
Dim DB_RSet               As New ADODB.recordSet          'Access Record Set

Dim sqlStrUpdate As String
Dim sqlStrInsert As String

cDir_Database = ".\.\.AccessBD.mdb "

sqlStrUpdate = "UPDATE table1 SET Field1 = " & 10 & " WHERE id = 4"

sqlStrInsert = "INSERT INTO table1 (id, Field1, Field2, Field3) VALUES (4, 5, 0, 0)"

        DB_Conn.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};" & _
                            "DBQ=" & cDir_Database & ";"
        DB_Conn.Open
        DB_Conn.BeginTrans

        DB_RSet.Open "SELECT id FROM table1 WHERE id = 4", DB_Conn, adOpenStatic, adLockReadOnly

        If DB_RSet.RecordCount > 0 Then
            DB_Conn.Execute (sqlStrUpdate)
        ElseIf DB_RSet.RecordCount = 0 Then
            DB_Conn.Execute (sqlStrInsert)
        End If

        DB_RSet.Close
        DB_Conn.CommitTrans
        DB_Conn.Close

End Sub

这已经从 Excel 2003 到 Access 2003 进行了测试并且有效。您需要将 Microsoft ActiveX 数据对象的引用添加到您的 Excel 文件中。

【讨论】:

  • 这似乎是一个非常干净的实现,但是当我运行它时,我得到:Set recordSet 行上的runtime error 3001 "Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another."
  • 你的 SQL Select 字符串是什么?
  • @Alec 正在从 Excel 中运行它,因此他的记录集可能是 ADO 而不是 DAO。
  • @HansUp 非常正确,我没有想到这一点。我刚刚在 Access 而不是 Excel 中测试了这个运行
  • HansUp 是对的。根据 bluefeet 的建议,我得到了它的工作并已将我的修复附加到我原来的问题上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 2019-08-08
  • 1970-01-01
相关资源
最近更新 更多