SQL 到 Excel table 在 VBA 中使用 IF EXISTS 抱怨 "Invalid SQL statement"

SQL to Excel table in VBA using IF EXISTS complains "Invalid SQL statement"

我在 VBA 中使用 SQL MS Excel 查询电子表格。我想检查记录是否存在,并根据需要更新或插入记录。这需要:

IF EXISTS (condition) UPDATE ELSE INSERT

"Test" 部分不起作用,并引发错误。在调试中,我从查询中删除了所有 Excel 元素,导致以下代码:

Dim conn As New ADODB.Connection
Dim recset As New ADODB.Recordset
Dim scmd As String
scmd = "IF EXISTS (SELECT 'Test')"
scmd = scmd + "SELECT 'Found' "

conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & ThisWorkbook.Name & ";" & _
"Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
conn.Execute (scmd)

conn.Close

这会生成 SQL 语句:

IF EXISTS (SELECT 'Test') SELECT 'Found' 

产生的错误是:

Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

我在 MS SSMS 中测试了相同的语句,它工作正常。消除了我的 Excel 电子表格和 SQL 语句的问题后,问题似乎出在 VBA 的怪癖中。我该如何解决这个问题?

就其价值而言,连接字符串适用于我项目中的纯 SELECT 查询。

Dim conn As New ADODB.Connection
Dim recset As New ADODB.Recordset
Dim scmd As String

scmd = "SELECT * from [Sheet1$]"

conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=" & ThisWorkbook.Path & "\" & ThisWorkbook.Name & ";" & _
    "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
recset.ActiveConnection = conn
recset.Open scmd

If Not recset.EOF And Not recset.BOF Then
    Debug.Print "found"
End If

conn.Close

这应该可以解决问题。基本上,这是您的代码,稍作更改。 正如 Alex-K 所指出的,Excel 引擎无法为您评估 if 语句。 SQL 服务器可以。但在 Excel 内,您必须限制 SQL 语言并自行评估 if,如上所示。

您正在使用 ACE OleDb 提供程序与电子表格进行交互。这意味着您只能使用提供程序支持您的数据源的 SQL 功能。 IF EXISTS 在这种情况下不受支持。

但是,可能还有一个更基本的问题。我不认为可以使用从 ACE OleDb 执行的 SQL 来更改电子表格的内容。