我已经在几个论坛上搜索了好几天但仍然卡住了。希望有人能在这里说清楚。
我对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
答案 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