不能在Excel中使用传递查询

我已经search了多个论坛好几天了,但仍然停滞不前。 希望有人能在这里说一些东西。

我越来越沮丧MS Office和本机SQL之间的SQL语法差异,我已经相信使用传递查询将允许我使用本机SQL。 我已经尝试了来自各种论坛的多个build议来创build一个通过查询,但我仍然面临在我的查询中的Office(语法)错误。

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

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

  • SQL Server 2014

  • MS Excel 2013

  • Microsoft DAO 3.6对象库

我怀疑连接string或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 

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

DAO连接

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

ADO连接

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

 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