sql-server - 无法在 Excel 中使用传递查询

标签 sql-server excel vba

我已经搜索了多个论坛好几天了,但仍然卡住了。希望有人可以在这里阐明一些观点。

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

下面是我的代码的一个简单示例,由于 ISNULL 语法,Excel/VBA 不喜欢它。请注意,问题不是 ISNULL 本身,我知道如何解决这个问题。这仅作为示例。问题是它应该在 native 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

最佳答案

指定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 连接

或者,使用可以读取任何外部 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

关于sql-server - 无法在 Excel 中使用传递查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35905858/

相关文章:

sql - 链式 CTE 与 Temp 表的性能影响

asp.net - 如何将数据从gridview导出到excel 2003,2007,2010没有警告消息

excel - 你如何从 Excel 宏调用,一个与 Excel 电子表格交互的 applescript?

ms-access - 获取 Access 表单以显示自定义类的属性值

vba - 宏 - 复制和粘贴

vba - 在VBA中重置表格

SQL 2005 - 查询查找行数最多的表

c# - 无法使用 EF 交换两行上的唯一值

SQL服务器: is there a way to get last record inserted without stored procedure?

java - Apache POI : Multiple cell comments in one cell are not allowed