在MS Access查询中调用SQL Server用户定义函数,得到“表达式中未定义的函数dbo.Funcname”

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

在MS Access中(我认为它是365版,因为这是帮助主题所引用的,但是没有“帮助/关于”选项),由于业务逻辑的变化,我正在修改查询。该查询通过ODBC连接引用SQL Server(2016)服务器上的表。

在查询的“ SQL视图”中,我在“ WHERE”部分添加了一个子句:

AND(dbo_GetPrevNameCatAsOfDate(dbo_Name.ID,Date()='FM'))

将其保存正常(出现语法错误时Access不会执行。)

运行查询,将弹出一个消息对话框:表达式中未定义的函数'dbo_GetPrevNameCatAsOfDate'。

我也在SQL视图中使用“ dbo”进行了尝试。并且在“获取”之前没有前缀,而不是“ dbo _”

在SQL Server中运行时,该功能可以正常工作。当我从SQL视图中删除AND子句时,Access查询工作正常。

你有什么想法吗?

谢谢!

sql-server ms-access
2个回答
2
投票

如果要从Access运行SQL Server中定义的功能,则需要将查询设置为直通查询。使用Passthrough查询按钮在设计视图中完成此操作。函数名称使用点,dbo.GetPrevNameCatAsOfDate

此外,如果要使用SQL Server函数,则不能将它们与Access函数混合使用。这意味着Date()应该变成GETDATE()

否则,您必须在VBA中实现业务逻辑才能在本地运行它。但是通常,在T-SQL中实现它并在SQL Server上运行它会更快。


0
投票

您不提及函数dbo_GetPrevNameCatAsOfDate()所在的位置/位置。

运行100%sql服务器端的任何内容(例如视图)都将要求您将VBA函数转换为我们在T-SQL中称为“定标器”函数的函数。因此,您可以在T-SQL函数中重写上述VBA函数。创建此函数后,就像在Access SQL中一样,如何在任何SQL中使用自定义VBA函数,就可以在T-SQL中进行相同的操作。

在大多数情况下,您在Access SQL中使用的自定义VBA函数可能是一个相当短的函数,因此将此类函数转换为T-sql函数(它们称为缩放器函数)将导致相同的开发过程。

关于唯一的缺点是,虽然您可以在t-sql中使用完全相同的函数名称,但不幸的是,所有缩放器函数都需要schemea前缀(我真希望不是这种情况)。因此,如果要将客户端Access SQL剪切并粘贴到SSMS中并创建视图?好了,您必须添加一个dbo。在函数名称前面。但是总而言之,对于此类迁移项目,重新创建VBA功能作为T-SQL是一个好主意。我在VBA中有一个自定义的GST()函数。并将sql和部件移到SQL,然后我在T-SQL中重新创建了GST()函数,因此我能够继续在我的t-sql查询和视图中使用GST()函数。

最后但并非最不重要?

嗯,毫无疑问,在访问客户端,您将链接到视图。因此,在链接视图上创建一个客户端查询,然后可以包含您的自定义VBA函数。

如果您确实需要并且想要使用链接视图,而不是基于链接视图的客户端查询,那么您可以简单地将自定义VBA函数重新创建为t-sql缩放器函数,然后继续使用任何t-sql查询(包括视图)中都可以使用。

因此,链接视图上的客户端查询可以包括+使用您的函数。但是,为了易于使用和获得最佳性能,请考虑将VBA函数例程创建为t-sql例程。尽管与VBA相比,t-sql受到一些限制,但它具有循环,字符串表达式,查询功能,并且实际上具有与典型VBA例程中非常相似的功能集-尤其是在sql查询中使用的功能作为一种表达。

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