我在SQL Server中有一个大型查询,它返回许多行和列。我需要在MS Access中为该查询创建一个用户界面。为了运行查询,我需要将一些变量传递给查询。例如:
DECLARE @start_date日期,@ end_date日期 选择 * 来自myTable 在哪里日期@Wart_date和@end_date
之间的日期我知道在ACCESS查询查看器中我没有DECLARE语句。但是有另一种方法将这些参数传递给查询吗? 我已经读过它可以用VBA完成,但我只想确认没有其他方法可以将值传递给变量。
理想情况下,我需要的是通过MS ACCESS与SQL Server进行交互
由于
答案 0 :(得分:1)
您没有提到在SQL Server上保存查询的位置/方式/时间。声明您有大量查询但忽略此查询所在的位置是非常详细的。
但是,您是否可以在没有任何代码的情况下将值传递给SQL Server?答案是肯定的,但这意味着您最好的方法是创建+将大型查询服务器端保存为VIEW。你不需要任何参数。
然后,当您在访问中启动表单(或报表)时,只需附加一个where子句:
MyDate is Between Forms!ReportPrompt!startDate and forms!ReportPrompt!EndDate
上述意味着没有VBA,没有参数,如果查询有100万行,但只有一行符合您的条件,那么只有一行将进入网络管道。您只需在报告过滤器中输入以上内容,然后将报告设置为过滤加载属性=是。
但是,如上所述,您没有提供有关查询在服务器端保存的位置或方式的详细信息。如果你在谈论商店程序(遗漏的大量细节),那么你可以通过这种方式传递parmaters:
Dim qdfPass As DAO.QueryDef
Dim rst As DAO.Recordset
Set qdfPass = CurrentDb.QueryDefs("MyPass")
qdfPass.SQL = "exec sp_myProc " & MyP1Var & "," & MyP2Var
qdfPass.Execute
以上假设您保存了一个名为MyPass的查询客户端传递。
实际上有十几种方法可以将值传递给SQL服务器,但是没有更多关于何时/如何/何时/何时以及在什么上下文中使用查询数据的信息,那么我们只面对野生和投机性猜测。
如果要将结果数据用于报告,那么如上所述,您实际上并不需要(也不会从存储过程中获益)并且使用“where”子句作为open report命令的一部分就足够了。如果您希望将此数据返回到表单,则适用相同的建议。
如果查询和存储过程只是要进行服务器端处理,那么调用存储过程并传递参数的上述代码就足够了。
答案 1 :(得分:1)
@Albert D. Kallal给出了最好的方法,即使用存储过程并将值作为参数传递。还有一些其他方法可以做到这一点: -
通过VBA代码中的ADODB: -
Dim con As New ADODB.Connection Dim rs As New ADODB.Recordset
con.Open“SQLSrv”,“User”,“Pass” rs。打开“DECLARE @start_date date,@ end_date date; SELECT * FROM myTable WHERE Date BETWEEN @start_date AND @end_date”,con
您可以编写执行相同操作的“直通”查询。
这两种方法目前都能正常工作,但微软正试图删除在单个执行中传入多个SQL语句的支持,你可能会发现更高版本的TDS(表格数据流 - 协议MS OBDC驱动程序与之通信SQL Server)不支持此功能。
答案 2 :(得分:0)
是的,有办法通过Access将参数传递给查询。您可以在表单(文本框等)上使用控件。然后,引用SQL的Criteria
(WHERE
)部分中的控件。
因此,如果我想在用户指定的两个日期之间的表中为员工记录DELETE *
,我会在表单上引用该控件,如下所示:
Between Forms![StartDateTxt] And Forms![EndDateTxt]