这更具概念性。我有一个查询,我目前在SQLServer中运行,我想在Access中进行直通查询。但是,它是一个怪物查询,必须受到我想要的ID#的WHERE子句的限制(有太多ID#s没有WHERE子句;它会冻结)。 ID#s我每天都需要更改,因此我无法设置此功能一次并完成。
所以我真的不知道如何获取它所以用户要么1.导入当天ID#s的表,该表链接到passthrough,或2.用户粘贴ID #s进入一个输入框,那些成为WHERE子句的条件。
据我所知,我无法使用ID#s加入Access中的表到Passthrough,我无法使用WHERE ID#= [table]。[ID#] in我的直路的哪一部分。取出直通中的WHERE,然后在与访问表连接的位置进行简单的选择查询也不起作用,因为查询只花了很长时间才超时。
这是否可能,或者我应该探索完全不同的策略?
答案 0 :(得分:0)
在SqlServer中构建查询,作为返回数据并接受参数的存储过程。构建一个表单,您可以在其中向用户请求ID,或者构建一个尽可能获取这些ID的函数。让存储过程中的参数成为WHERE子句中所需的ID。
您可以使用querydef(例如
)以动态方式重新定义查询的SQLCurrentDb.QueryDefs("myAccessQueryPassT").sql =
"EXEC mySqlServerStoredProc (" & par1 & ", " & par2 & ")"
其中par1,par2,... par(n)是您要过滤的ID。
然后您可以照常运行msAccess查询:
SELECT * FROM myAccessQueryPassT
请注意,您还可以在SqlServer(mySqlServerView
)中定义未过滤的视图,然后在直通中(在示例中我只包含一个参数,当然可以包含更多参数):
CurrentDb.QueryDefs("myAccessQueryPassT").sql =
"SELECT *
FROM mySqlServerView
WHERE ID = " & par1 & ")"
当然,你总是可以在语法上建立整个查询,在这种情况下它会像:
CurrentDb.QueryDefs("myAccessQueryPassT").sql = "SELECT ... FROM ... WHERE..."
与查询直通之前相同:
SELECT * FROM myAccessQueryPassT
答案 1 :(得分:0)
当我有奇怪的传递查询时,我会使用另一种技术
首先,我创建一个虚拟传递查询,其中主观的一切都由虚拟常量
表示
例如,如果我有一年的变化我有一个假的1900年,我使用替换将其改为我需要的任何东西
然后将更改的SQL传递给另一个传递,通过该传递充当
所以我的代码就像这样
Const DummyToReplace = "1900"
Dim strSql as String
Dim qdf as QueryDef
strsql = vbnullstring
set qdf = currentdb.QueryDefs(SourceDummyPassThroughQry)
strsql = qdf.SQL
set qdf = nothing
strsql = replace(strSql,DummyToReplace ,TheCriteriaYouwantToPass)
set qdf = currentdb.QueryDefs(ModifiedPassThrough)
qdf.SQL = strsql
set qdf=nothing
此时,您可以执行ModifiedPassThrough或将其用作RecordSource。 在WHERE的情况下,您可以使用字符串拆分将SQL拆分为2个部分 第一部分到WHERE例如
strSql = SELECT * from my TABLE WHERE
第二部分只是把Where Criteria
WhereCriteria = " ID IN (Various IDs)"
所以你连接然后将它们提供给修改后的Pass Through
qdf.SQL = strsql & " " & WhereCriteria
其余的很容易