Sql server 无法在Excel中使用传递查询
我已经搜索了多个论坛好几天了,但仍然卡住了。希望有人能给我们点启示 我对MS Office和本机SQL之间的SQL语法差异越来越感到沮丧,并且我一直相信使用传递查询将允许我使用本机SQL。我尝试了来自不同论坛的多个建议来创建传递查询,但我仍然面临查询中的Office(语法)错误 下面是我的代码的一个简单示例,由于ISNULL语法,Excel/VBA不喜欢它。请注意,问题不在于ISNULL本身,我知道如何解决这个问题。这只是一个例子。问题是它应该在本机SQL中工作(在SQLServerManagementStudio中也是如此) 为了完整性,我使用:Sql server 无法在Excel中使用传递查询,sql-server,excel,vba,Sql Server,Excel,Vba,我已经搜索了多个论坛好几天了,但仍然卡住了。希望有人能给我们点启示 我对MS Office和本机SQL之间的SQL语法差异越来越感到沮丧,并且我一直相信使用传递查询将允许我使用本机SQL。我尝试了来自不同论坛的多个建议来创建传递查询,但我仍然面临查询中的Office(语法)错误 下面是我的代码的一个简单示例,由于ISNULL语法,Excel/VBA不喜欢它。请注意,问题不在于ISNULL本身,我知道如何解决这个问题。这只是一个例子。问题是它应该在本机SQL中工作(在SQLServerManage
- SQL Server 2014
- MS Excel 2013
- Microsoft DAO 3.6对象库
选项显式
子测试查询SQL()
Dim sqlConnect作为字符串,dsnName作为字符串,dbName作为字符串,sqlString作为字符串,db作为数据库,qd作为QueryDef,rs作为记录集
dsnName=“MyDSN”
dbName=“MyDatabaseName”
sqlConnect=“ODBC;DSN=”&dsnName&“受信任的\u连接=是;”
sqlString=“选择isnull(d.Name,???')作为经销商d的经销商名称”
Set db=OpenDatabase(dbName、dbDriverNoPrompt、True、sqlConnect)
出错时继续下一步
Set qd=db.CreateQueryDef(“,sqlString)
如果错误号为0,则
MsgBox“CreateQueryDef失败。SQL=>”&sqlString&“<”&Err.Number&“Err=>”&Err.Description&“&sqlString&””&Err.Description&“指定记录集行中的选项。没有此指定,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连接
Set db = OpenDatabase(dbName, dbDriverNoPrompt, True, sqlConnect)
Set rs = db.OpenRecordset(sqlString, dbOpenDynaset, dbSQLPassThrough)
或者,使用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
忘了提一下,如果有帮助的话,我得到的错误消息是“查询表达式'isnull(d.Name',???')中函数使用的参数数量错误”“,这是Excel/Access为此函数使用不同语法的结果。SQL是任何实体都不拥有的语言,各种RDM使用不同的方言。因此,MS Access SQL与SQL Server SQL不同,MySQL/Postgre/DB2/SQLite SQL也不同。因此没有真正的原生SQL。ISNULL()
用于Access和MSSQL,但用于不同的实现。对于Access,此不带参数的函数返回true/false,但不返回SQL Server。您是连接到SQL Server还是.mdb/.accdb数据库?如果是前者,则您的查询有效。如果是后者,则会出现错误。@Parfait:我正在连接SQL Server,因此我相信我的查询应该可以工作。简言之,我希望我的代码能够按照SQLServer语法进行验证。当我使用DAO时,我选择了第一个,它工作得非常好。我读过几篇论坛帖子,你需要使用QueryDef来处理传递查询,这显然是不正确的,但主要原因是我花了一周左右的时间才对这个问题感到困惑。再次感谢冻糕。很高兴能帮上忙。我也学到了一些东西,因为我只在MS Access中严格使用DAO,直到现在才在Excel中使用!好问题。