从 Access 将值传递到 SQL Server 中的变量

问题描述 投票:0回答:4

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

声明@start_date日期,@end_date日期 选择 * 来自我的表 @start_date 和 @end_date 之间的日期

我知道我不能在 ACCESS 查询查看器中使用 DECLARE 语句。但是还有其他方法将这些参数传递给查询吗? 我读到可以使用 VBA 来完成,但我只是想确认没有其他方法可以将值传递给变量。

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

谢谢

sql-server ms-access ms-access-2007
4个回答
1
投票

您没有提及该查询在 SQL Server 上保存的位置/方式/时间。说明您有一个很大的查询,但忽略了该查询所在的位置是很重要的细节。

但是,您会问是否可以在不使用任何代码的情况下将值传递给 SQL Server?答案是肯定的,但这意味着最好的方法是创建并保存大型查询服务器端作为视图。您不需要任何参数。

然后,在访问中启动表单(或报告)时,只需附加一个 where 子句:

MyDate is Between Forms!ReportPrompt!startDate and forms!ReportPrompt!EndDate

上面的意思是没有 VBA,没有参数,如果查询有 100 万行,但只有一行符合您的条件,那么只有一行会通过网络管道。您只需在报告过滤器中输入以上内容,然后将报告设置为在加载属性 = 是时进行过滤即可。

但是,如上所述,您没有提供太多关于查询在服务器端保存的位置或方式的信息。如果您谈论存储过程(需要省略大量细节),那么您可以通过这种方式传递参数:

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 Server,但是如果没有更多关于在何处/如何/何时/何时以及在什么上下文下使用查询数据的信息,那么我们面临的只是疯狂和推测性的猜测.

如果结果数据要用于报告,那么如上所述,您实际上不需要(也不会受益)存储过程,并且使用“where”子句作为打开报告命令的一部分就足够了。如果您希望将此数据返回到表单,同样的建议也适用。

如果查询和存储过程仅要做服务器端处理,那么上面调用存储过程并传递参数的代码就足够了。


1
投票

@Albert D. Kallal 给出了执行此操作的最佳方法,即使用存储过程并将值作为参数传递。还有一些其他方法可以做到这一点,例如:-

  1. 通过 VBA 代码中的 ADODB :-

    Dim con 作为新的 ADODB.Connection 调暗 rs 作为新的 ADODB.Recordset

    con.打开“SQLSrv”、“用户”、“密码” rs.Open“声明@start_date日期,@end_date日期;SELECT * FROM myTable WHERE Date BETWEEN @start_date AND @end_date”,con

  2. 您可以编写一个“传递”查询来执行相同的操作。

这两种方法目前都可以使用,但是 Microsoft 正在尝试取消对在单次执行中传递多个 SQL 语句的支持,您可能会发现更高版本的 TDS(表格数据流 - MS OBDC 驱动程序与 SQL Server 通信的协议) )不支持这个。


0
投票

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

Criteria
(
WHERE
) 部分中的控件。

因此,如果我想要

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

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

-1
投票

复活这个已有 10 年历史的线程:-)。我正在尝试将以下查询从访问权限移至 Azure SQL 服务器中的视图:

选择不同的 Verses.Id、Verses.VerseText、Verses.NumChars FROM Verses LEFT JOIN (QWords RIGHT JOIN QWordsOfVerses ON QWords.ID = QWordsOfVerses.QWordId) ON Verses.Id = QWordsOfVerses.VerseId WHERE (((QWords.QWordText) Like "" & [forms]![B__Main]![cmbSearchQWord] & ""))

问题是,如何将“[forms]![B__Main]![cmbSearchQWord]”的值传递到Azure?

陶瑟夫

© www.soinside.com 2019 - 2024. All rights reserved.