我可以从 Microsoft Access 调用 SQL Server 的用户定义函数吗

Posted

技术标签:

【中文标题】我可以从 Microsoft Access 调用 SQL Server 的用户定义函数吗【英文标题】:Can I call an SQL Server's user defined function from Microsoft Access 【发布时间】:2010-11-10 22:21:31 【问题描述】:

我正在尝试将我的 Access 应用程序升级为 Access FE 和 SQL Server 数据库 BE。

我遇到的一个问题是带有“过滤参数”的查询是在客户端执行的,并且需要将所有行从服务器发送到客户端。

示例:

SELECT * FROM MyTable WHERE MyId = Forms!MyForm!MyControl.Value;

此查询将要求将 MyTable 中的所有行从 SQL Server 发送到最终将执行 WHERE 子句的 Access。

我已经阅读了有关 SQL Server 的用户定义函数的信息,如果我可以像在 SQL Server 查询中那样从 Access 中调用它们,它看起来对我有用。

我可以这样做吗?

【问题讨论】:

【参考方案1】:

MyID 是否已编入索引?如果是这样,那么 Access 不应将整个表从服务器拖过。

不过,我不确定您从哪里获得条件,因为这不是表单过滤器要发送的 SQL。甚至是保存的 QueryDef,其中包含对表单上控件的硬连线引用。

尝试删除 .Value(这是多余的,因为它是默认属性)。

另外,如果是已保存的 QueryDef,请尝试将控件引用定义为参数,即 PARAMETERS Forms!MyForm!MyControl Long;

基本上,您报告的任何内容都不是标准的访问行为,即 ODBC 链接表到 SQL Server。如果是这样,Access 将无法升级,而且根本不是。

【讨论】:

好吧,我必须承认我自己没有测试过这个。我在网上某处读到,在这种情况下,Access 不会将 WHERE 发送到 SQL 服务器。如果我能找到一种方法来查看 Access 向服务器发送的内容,我将尝试自己进行测试。 Jet/ACE 在将数据检索交给服务器方面非常聪明。您可以通过为其提供服务器无法执行的操作来强制执行此操作(例如在 Access UDF 上进行选择),但您发布的 SQL 根本不会引起任何问题。【参考方案2】:

应该可以使用“直通”查询。

【讨论】:

【参考方案3】:

我同意,传递查询会做到这一点,但这会在您的应用程序窗口中留下一个持久查询对象。

使用 ADO 记录集和连接对象将允许您将过滤结果返回到记录集中,但您需要编写 TSQL 语句,这与 Access SQL 不同。

【讨论】:

如果您需要根据来自 Access 表单上的控件的数据过滤返回的数据,那么如果没有它,传递将无法为您提供任何您没有的东西。 我经常在 TSQL 中动态构建一个 sql 字符串(包含表单控件的值),然后更新传递查询的 sql 属性。这个直通查询会给您更快的响应,因为它绕过了 ODBC 转换层。

以上是关于我可以从 Microsoft Access 调用 SQL Server 的用户定义函数吗的主要内容,如果未能解决你的问题,请参考以下文章

VB.NET 与 Microsoft Access 交谈 - 可以进行回调吗?

如果不是交互式的,来自 Microsoft Access VBA 的 mySQL 查询会失败吗?

我可以从 Microsoft Access VBA 中的当前事件堆栈返回吗?

从 Microsoft Access 导出代码

Microsoft Access Runtime 2013 - 从 Excel 导入

致命错误:在非对象上调用成员函数 fetchALL() - 在 Microsoft Access 数据库上使用 PDO