无法在Excel中使用传递查询

时间:2016-03-10 01:18:06

标签: sql-server excel vba

我已经在几个论坛上搜索了好几天但仍然卡住了。希望有人能在这里说清楚。

我对MS Office和本机SQL之间的SQL语法差异越来越感到沮丧,我一直认为使用传递查询将允许我使用本机SQL。我已经尝试了各种论坛的多个建议来创建传递查询,但我仍然在查询中遇到Office(语法)错误。

以下是我的代码的一个简单示例,由于ISNULL语法,Excel / VBA不喜欢它。请注意,这不是ISNULL本身的问题,我知道如何解决这个问题。这仅仅是举例。问题是它应该在本机SQL中工作(它在SQL Server Management Studio中工作)。

为了完整起见,我正在使用:

  • SQL Server 2014

  • MS Excel 2013

  • Microsoft DAO 3.6对象库

我怀疑连接字符串或DAO对象库可能是罪魁祸首,但我尝试了多个具有相同结果的其他字符串。

下面是完整的示例(OpenRecordSet失败)代码。我将永远感激任何可以提供的帮助。

谢谢, 莱恩

Option Explicit

Sub TestQuerySQL()
Dim sqlConnect As String, dsnName As String, dbName As String, sqlString As String, db As Database, qd As QueryDef, rs As Recordset

   dsnName = "MyDSN"
   dbName = "MyDatabaseName"

   sqlConnect = "ODBC;DSN=" & dsnName & ";Trusted_Connection=yes;"
   sqlString = "Select isnull(d.Name, '???') as DealerName from Dealer d"

   Set db = OpenDatabase(dbName, dbDriverNoPrompt, True, sqlConnect)

   On Error Resume Next
   Set qd = db.CreateQueryDef("", sqlString)

   If Err.Number <> 0 Then
      MsgBox "CreateQueryDef failed. SQL=>" & sqlString & "< " & Err.Number & " Err=>" & Err.Description & "<", vbCritical
   Else
      qd.ReturnsRecords = True

      Set rs = qd.OpenRecordset(dbOpenSnapshot, dbReadOnly)

      If Err.Number <> 0 Then
         MsgBox "OpenRecordset Failed. SQL=>" & sqlString & "< Err=>" & Err.Description & "<", vbCritical
      Else
         MsgBox "Success"
         'do someting with the results
      End If
   End If
End Sub

1 个答案:

答案 0 :(得分:0)

在记录集行中指定dbSQLPassthrough选项。如果没有这个名称,JET / ACE DAO引擎使用自己的SQL方言,因此将ISNULL()解释为逻辑函数,而不是SQL Server的ISNULL()作为值函数。下面直接打开记录集,不使用querydef:

DAO连接

Set db = OpenDatabase(dbName, dbDriverNoPrompt, True, sqlConnect)
Set rs = db.OpenRecordset(sqlString, dbOpenDynaset, dbSQLPassThrough)

ADO连接

或者,使用ADO连接,可以读取任何外部SQL引擎的方言:

Dim conn As New ADODB.Connection, rst As New ADODB.Recordset
Dim sqlConnect As String, sqlString As String

' REFERENCE THE MICROSOFT ACTIVEX DATA OBJECTS XX.X LIBRARAY '
sqlConnect = "ODBC;DSN=" & dsnName & ";Trusted_Connection=yes;"
sqlString = "Select isnull(d.Name, '???') as DealerName from Dealer d"

conn.Open sqlConnect
rst.Open sqlString, conn