将值传递给Access中的SQL Server中的变量

时间:2014-02-19 03:08:40

标签: sql-server ms-access ms-access-2007

我在SQL Server中有一个大型查询,它返回许多行和列。我需要在MS Access中为该查询创建一个用户界面。为了运行查询,我需要将一些变量传递给查询。例如:

DECLARE @start_date日期,@ end_date日期 选择 * 来自myTable 在哪里日期@Wart_date和@end_date

之间的日期

我知道在ACCESS查询查看器中我没有DECLARE语句。但是有另一种方法将这些参数传递给查询吗? 我已经读过它可以用VBA完成,但我只想确认没有其他方法可以将值传递给变量。

理想情况下,我需要的是通过MS ACCESS与SQL Server进行交互

由于

3 个答案:

答案 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给出了最好的方法,即使用存储过程并将值作为参数传递。还有一些其他方法可以做到这一点: -

  1. 通过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

  2. 您可以编写执行相同操作的“直通”查询。

  3. 这两种方法目前都能正常工作,但微软正试图删除在单个执行中传入多个SQL语句的支持,你可能会发现更高版本的TDS(表格数据流 - 协议MS OBDC驱动程序与之通信SQL Server)不支持此功能。

答案 2 :(得分:0)

是的,有办法通过Access将参数传递给查询。您可以在表单(文本框等)上使用控件。然后,引用SQL的CriteriaWHERE)部分中的控件。

因此,如果我想在用户指定的两个日期之间的表中为员工记录DELETE *,我会在表单上引用该控件,如下所示:

Between Forms![StartDateTxt] And Forms![EndDateTxt]