【问题标题】:Passing values to variables in SQL server from Access从 Access 将值传递给 SQL Server 中的变量
【发布时间】:2014-02-19 17:53:59
【问题描述】:

我在 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


【解决方案1】:

您没有提及该查询在 SQL 服务器上的保存位置/方式/时间。说明您有大型查询但忽略此查询所在的位置是很详细的。

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

然后,您在访问中启动表单(或报告)时,只需附加一个 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 服务器,但是如果没有更多关于查询数据将在何处/如何/何时/何时以及在什么上下文中使用的信息,那么我们只会面临狂野和推测性的猜测。

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

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

【讨论】:

  • 感谢您:查询目前未保存。该查询进行了大量计算,因此需要传递参数。我还没有考虑过作为SP来做这件事。那么您提供的上述代码需要进入VBA编辑器吗?我想要的是将此查询的结果带入 Access 中,放入表中。我尝试过通过,但我一直卡在将值传递给参数。数据将用于在表单中呈现,稍后需要用户更新一些数据。
  • 我无法使用上面的代码传递参数。它一直说我的 SP 需要一个参数,即使我使用此代码传递它。
  • 您需要将数据作为本地表格,还是仅将数据作为报告的来源?在我上面的 qdfPass.SQL = "your sql goes here" 中,只需添加带有 "where" 子句的 sql。不需要 SP 或参数。然后根据该传递运行您的报告。
【解决方案2】:

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

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

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

    con.Open "SQLSrv", "User", "Pass" rs.Open "DECLARE @start_date date, @end_date date; SELECT * FROM myTable WHERE Date BETWEEN @start_date AND @end_date", con

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 2014-01-08
      • 1970-01-01
      • 2023-04-11
      • 2018-07-03
      • 2012-01-29
      相关资源
      最近更新 更多