在Excel VBA中运行SQL“;选择。。。进入在……中“;陈述

在Excel VBA中运行SQL“;选择。。。进入在……中“;陈述,sql,vba,excel,dao,Sql,Vba,Excel,Dao,我似乎找不到任何好的参考资料或例子来说明如何让它发挥作用。我有一个存储在AS/400上的数据库(我的本地MS Access数据库[存储在网络驱动器上]使用ODBC/DSN将表链接到400)。我的实用程序可以很好地通过访问将SQL语句传递到数据库,从而使用链接表从数据库检索数据。问题是,对于一些较大的报告,以及400个州之间的距离,运行报告可能需要几个小时。解决这一问题的解决方案是创建所需表的本地“副本”,只使用与报表相关的数据集,这是一个相当小的数据集。显然,这有不“实时”数据的缺点,但我可以接

我似乎找不到任何好的参考资料或例子来说明如何让它发挥作用。我有一个存储在AS/400上的数据库(我的本地MS Access数据库[存储在网络驱动器上]使用ODBC/DSN将表链接到400)。我的实用程序可以很好地通过访问将SQL语句传递到数据库,从而使用链接表从数据库检索数据。问题是,对于一些较大的报告,以及400个州之间的距离,运行报告可能需要几个小时。解决这一问题的解决方案是创建所需表的本地“副本”,只使用与报表相关的数据集,这是一个相当小的数据集。显然,这有不“实时”数据的缺点,但我可以接受。最终,我要做的是从链接表中收集相关数据,并将其保存到客户端本地的单独数据库中,以便在离线/离线时使用,并提高报告的速度

网络位置存储数据库=DB1(表格链接到AS/400) 本地客户机存储数据库=DB2(由以下SQL创建的相关数据集,命名与链接表相同的非链接表)

下面是我试图使用VBA和DAO来使用的SQL语句

选择
DB1_表A.FIELD1,
DB1_表a.FIELD2,
DB1_表a.FIELD3,
DB1_表A.4,
DB1_表A.5,
DB1_表A.6,
DB1_表A.7,
DB1_表a.FIELD8
进入

“Local\u DB\u Copy.accdb”中的DB1\u TABLEA您不能将类似make table查询的操作查询(即,
SELECT
with
INTO
call)分配给记录集。考虑执行<代码>下拉< /代码>和<代码>选择…在打开本地表上的记录集之前进入
操作查询。此外,还不清楚为什么要打开第二个数据库,或者路径指向什么。下面打开大型机数据上的记录集:

Set DB=OpenDatabase(LocalDBPath,False,False)
执行“DROP TABLE DB2_TABLEA”,dbFailOnError
执行sSQL,dbFailOnError
Set RS=DB.OpenRecordset(“从DB2_表中选择*)

此外,make table查询中的
IN
子句是不必要的,因为您当前连接到正在运行操作的数据库。只需删除它(“&LocalDBPath&”)。此外,不带通配符和数字的
类似表达式应替换为
=

选择
DB1_表A.FIELD1,
DB1_表a.FIELD2,
DB1_表a.FIELD3,
DB1_表A.4,
DB1_表A.5,
DB1_表A.6,
DB1_表A.7,
DB1_表a.FIELD8
进入
DB2_表
从…起
DB1_表a
哪里
(
((DB1_TABLEA.FIELD4)=99999)
及
((DB1_TABLEA.FIELD6)='02'或(DB1_TABLEA.FIELD6)='22')
)
;

实际上,考虑将查询保存在MS Access数据库内部(带->创建->查询设计-> SQL视图),并将其称为命名对象,避免VBA中的任何长SQL。

DB.Execute“DROP TABLE DB2_TABLEA”,dbFailOnError
执行“mySavedQuery”,dbFailOnError
Set RS=DB.OpenRecordset(“从DB2_表中选择*)

yuu得到了什么错误?@Kubie-在
Set RS=DB2.OpenRecordSet(sSQL)
I得到了以下错误“运行时错误'3067”:查询输入必须至少包含一个表或查询。我还尝试更改了
Set RS=DB2.OpenRecordSet(sSQL)行
to
DB2.executessql
仍然会收到相同的错误:/you考虑过尝试ADODB而不是DAO吗?我们这里也大量使用大型机,ADODB对我来说运行得很好。您的设置不清楚。我有一个存储在主机上的数据库。。。这主要是指IBM的DB2。MS Access如何适应这种情况?您是否在MS Access内部将表链接到DB2。因此,在运行此代码之前,数据库的本地副本不存在?如果本地副本存在,将删除其中的表并重新创建以刷新数据。Parfait-我已将此标记为答案。我意识到我的SQL语句中的
&DBPath&
应该是
&LocalDBPath&
。一旦我做了更改,那么我的SQL就可以使用您建议的
db.Execute
方法完美地运行了!很乐意帮忙。我在Linux桌面上使用DB2。在大型机上运行会很酷!