Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 无法在Excel中使用传递查询_Sql Server_Excel_Vba - Fatal编程技术网

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

Sql server 无法在Excel中使用传递查询,sql-server,excel,vba,Sql Server,Excel,Vba,我已经搜索了多个论坛好几天了,但仍然卡住了。希望有人能给我们点启示 我对MS Office和本机SQL之间的SQL语法差异越来越感到沮丧,并且我一直相信使用传递查询将允许我使用本机SQL。我尝试了来自不同论坛的多个建议来创建传递查询,但我仍然面临查询中的Office(语法)错误 下面是我的代码的一个简单示例,由于ISNULL语法,Excel/VBA不喜欢它。请注意,问题不在于ISNULL本身,我知道如何解决这个问题。这只是一个例子。问题是它应该在本机SQL中工作(在SQLServerManage

我已经搜索了多个论坛好几天了,但仍然卡住了。希望有人能给我们点启示

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

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

为了完整性,我使用:

  • SQL Server 2014

  • MS Excel 2013

  • Microsoft DAO 3.6对象库

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

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

谢谢, 瑞安

选项显式
子测试查询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中使用!好问题。