Sql server 从Access向SQL server中的变量传递值

Sql server 从Access向SQL server中的变量传递值,sql-server,ms-access,ms-access-2007,Sql Server,Ms Access,Ms Access 2007,我在SQLServer中有一个大型查询,它返回许多行和列。我需要在MS Access中为该查询创建一个用户界面。为了运行查询,我需要向查询传递一些变量。例如: 声明开始日期、结束日期 挑选* 从myTable 其中日期介于@start_Date和@end_Date之间 我知道我不能在ACCESS查询查看器中使用DECLARE语句。但是有没有其他方法将这些参数传递给查询? 我已经读过,它可以用VBA来完成,但我只想确认没有其他方法可以将值传递给变量 理想情况下,我需要的是通过MS ACCESS与S

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

声明开始日期、结束日期 挑选* 从myTable 其中日期介于@start_Date和@end_Date之间

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

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


谢谢

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

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

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

您没有提到该查询在SQL server上保存的位置/方式/时间。声明您有一个大的查询,但忽略这个查询所在的位置是一个很大的细节

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

然后,在access中启动表单(或报表)时,只需附加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 server,但如果没有更多关于在何处/如何/何时/何时以及在何种上下文下使用查询数据的信息,那么我们只会面临疯狂的猜测

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


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

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

  • 通过VBA代码中的ADODB:-

    Dim con作为新的ADODB连接 将rs设置为新ADODB.Recordset

    con.打开“SQLSrv”、“User”、“Pass” rs.打开“声明@start\u日期,@end\u日期;从myTable中选择*,其中日期介于@start\u日期和@end\u日期之间”,con

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


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

    谢谢:查询目前不保存。查询执行大量计算,因此需要传递参数。我没有考虑过作为一个SP来做。所以您提供的上述代码需要进入VBA编辑器?我想要的是将这个查询的结果放入Access,放入一个表中。我试着做了一个传递,但是我一直在把值传递给参数。这些数据将被用来呈现在表单中,稍后一些数据将需要用户更新。我在使用上面的代码传递参数时遇到问题。它总是说我的SP需要一个参数,即使我用这段代码传递它。您需要数据作为本地表,还是只需要数据作为报表的源?在我上面的qdfPass.SQL=“您的SQL在这里”,只需添加带有“where”子句的SQL。不需要SP或PARMATER。然后根据该传递运行报告。