Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 让递归查询在Access 2013中工作_Sql Server_Ms Access_Recursion_Vba - Fatal编程技术网

Sql server 让递归查询在Access 2013中工作

Sql server 让递归查询在Access 2013中工作,sql-server,ms-access,recursion,vba,Sql Server,Ms Access,Recursion,Vba,经过一天的研究,我认为我的问题已经到了终点。我自学了递归查询,并在SQLServerManagementStudio 2014中成功地执行了它。然而,当我将在SQL Server 2014中编写的查询转换为Access 2013应用程序时,我立即被击倒。通过阅读其他文章,我现在了解到Access不支持递归查询。因此,我需要帮助找到一种资源高效的方法来提取这些记录并将它们放入数组变量中。我过去在VBA中模仿这一点的努力是可怕的;处理时间为30-60秒。任何关于如何精简此流程的建议都将不胜感激 我想

经过一天的研究,我认为我的问题已经到了终点。我自学了递归查询,并在SQLServerManagementStudio 2014中成功地执行了它。然而,当我将在SQL Server 2014中编写的查询转换为Access 2013应用程序时,我立即被击倒。通过阅读其他文章,我现在了解到Access不支持递归查询。因此,我需要帮助找到一种资源高效的方法来提取这些记录并将它们放入数组变量中。我过去在VBA中模仿这一点的努力是可怕的;处理时间为30-60秒。任何关于如何精简此流程的建议都将不胜感激

我想模拟的递归查询是:

WITH MyCTE(BusinessUnitID, Active)
AS(

SELECT a.BusinessUnitID, a.Active
FROM t_EMS_BM_BusinessUnits AS a
WHERE BusinessUnitID = 7

UNION ALL

SELECT d.BusinessUnitID, d.Active
FROM MyCTE AS c
INNER JOIN t_EMS_BM_BusinessUnits AS d
ON c.BusinessUnitID = d.ParentUnit)

SELECT *
FROM MyCTE
WHERE Active = 1
我糟糕的VBA脚本是:

专用子加载数组(intBU为整数)
'通过将所有子单元添加到intBUs阵列,为业务单元设置汇总数据
将sql设置为字符串
将遥感器作为记录集
Dim intCount为整数
sql=“从t_EMS_BM_BusinessUnits中选择BusinessUnitID,ParentUnit,其中Active=按BusinessUnitID排序的真实订单”
Set rs=currentdb.OpenRecordset(sql、dbOpenDynaset、dbSeeChanges)
“寻找子单位
用rs
整数=0
ReDim intBUs(1到1)作为整数
如果不是。EOF和非。BOF,则
.最后一个
.先走一步
做而不做
如果IsChild(intBU,!BusinessUnitID)=True,则
'添加到数组
intCount=intCount+1
如果intCount>1,则
ReDim将intBUs(1到UBound(intBUs)+1)保留为整数
intBUs(UBound(intBUs))=!商业单位
ElseIf intCount=1,则
intBUs(UBound(intBUs))=!商业单位
如果结束
如果结束
.下一步
环
如果结束
.结束
以
设置rs=无
私有函数IsChild(TargetBU,CurrentBU为整数)为布尔值
'检查单元是否为最低级别的子级
“TargetBU是CurrentBU的孩子吗?
作为整数的Dim intX
Dim intCount为整数
intX=0
如果TargetBU=CurrentBU,则
'返回值true
IsChild=True
其他的
直到intX=-1为止
“找到地狱的最底层
intCount=DCount(“BusinessUnitID”、“t\u EMS\u BM\u BusinessUnits”、“ParentUnit=”&CurrentBU)
如果intCount=0,则
intX=-1
其他的
CurrentBU=DLookup(“BusinessUnitID”、“t_EMS\u BM\u BusinessUnits”、“ParentUnit=”&CurrentBU)
intX=0
如果结束
环
'重置前哨值
intX=0
直到intX=-1为止
'树,直到记录匹配TargetBU或到达顶部“0”
如果CurrentBU=TargetBU或CurrentBU=0,则
IsChild=True
intX=-1
其他的
"上一层楼",
CurrentBU=Nz(DLookup(“父单元”、“t\U EMS\U BM\U业务单元”、“BusinessUnitID=“&CurrentBU”),0)
IsChild=False
intX=0
如果结束
环
如果结束
端函数

您的数据是否仍驻留在sql server中?如果是这样,您可以很容易地创建一个包含递归cte的过程,并接收过滤等所需的任何参数。如果数据实际上驻留在Access中,那么递归CTE将不起作用。如@SeanLange所说,您可以在SQL Server中创建一个视图并链接到Access中的视图,在Access中使用传递查询(这将在Access中保存查询,但在SQL Server中执行T-SQL)或者使用一个存储过程并通过ADO调用它,将数据放入记录集中。Steve,听起来在SQL Server之前您将无法访问。因此,您必须使用VBA。这可以运行得非常快,事实上,如果您可以将数据复制到本地表,速度会非常快。我想一些额外的细节可能会有所帮助。Access是我的前端应用程序,SQL Server 2014是我的后端。我所有的表都是通过一个无DNS连接链接的,这似乎是我在这个场景中问题的根源。感谢@Brad的直通推荐。我在应用程序中加入了一个直通查询,到目前为止,它运行良好。您的数据仍然驻留在sql server中吗?如果是这样,您可以很容易地创建一个包含递归cte的过程,并接收过滤等所需的任何参数。如果数据实际上驻留在Access中,那么递归CTE将不起作用。如@SeanLange所说,您可以在SQL Server中创建一个视图并链接到Access中的视图,在Access中使用传递查询(这将在Access中保存查询,但在SQL Server中执行T-SQL)或者使用一个存储过程并通过ADO调用它,将数据放入记录集中。Steve,听起来在SQL Server之前您将无法访问。因此,您必须使用VBA。这可以运行得非常快,事实上,如果您可以将数据复制到本地表,速度会非常快。我想一些额外的细节可能会有所帮助。Access是我的前端应用程序,SQL Server 2014是我的后端。我所有的表都是通过一个无DNS连接链接的,这似乎是我在这个场景中问题的根源。感谢@Brad的直通推荐。我将pass-thru查询合并到应用程序中,到目前为止,它运行良好。