缓存用户定义函数的输出(ms sql server)

Posted

技术标签:

【中文标题】缓存用户定义函数的输出(ms sql server)【英文标题】:caching output of a user defined function (ms sql server) 【发布时间】:2011-05-10 19:31:04 【问题描述】:

我今天了解到 MS SQL Server 中的用户定义函数必须是确定性的 - 也就是说,您不能 INSERTUPDATE 或任何会改变环境的东西。

因此,如果您有一个接受三个参数的函数,并使用它们处理大量缓慢的表工作,那么显而易见的事情可能是将这些结果缓存在某个地方。如果缓存值足够新,则让函数返回缓存值,如果绝对需要,则执行缓慢燃烧的表工作。

但由于我不能从 UDF 内部INSERT,所以我不能缓存我的结果。我即将把这个缓存写入我的应用程序,但真的没有办法使用 SQL 来完成同样的事情吗?

更新

谢谢,cmets!

我想使用函数的结果作为查询条件。所以 SP 不会这样做。

具体来说,我有一个函数可以根据产品、状态、日期等计算系统中“笔记”的数量。有很多参数,但结果不会经常变化。或者我有一个函数,它接受一个字符串并根据一些计算返回一个表——很容易做一次,而且永远不会改变。

【问题讨论】:

您使用的是哪个数据库?一些数据库允许在 sql 本身中创建函数。否则,为什么不能使用存储过程?请更具体地说明您要实现的目标。 它们不必是确定性的(允许返回 getdate() 的函数,但这不是确定性的)。但它们不会有副作用。 【参考方案1】:

你不能像你所说的那样在函数中插入/更新,所以我认为需要一种不同的方法。你为什么不做一个你需要做的逻辑的SP(存储过程)(你需要传入的所有参数)然后缓存它。这个 SP 也有一个 OUTPUT 参数,它会返回你的“笔记”的数量。

然后,无论您需要在何处调用该函数,您都可以为这些查询创建一个 SP。现在,在 SP 中,您可以调用之前创建的 SP,并让它返回变量中的值,您可以将其用作任何查询的返回......

查看 OUTPUT 参数语法(如果您还不知道的话):http://msdn.microsoft.com/en-us/library/ms378108(v=sql.90).aspx

【讨论】:

以上是关于缓存用户定义函数的输出(ms sql server)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server用户自定义函数(UDF)

在 SQL Server 中创建用户定义的 ROUND 函数

sql MS SQL用户定义的函数语法

重新定义 MS Access 文件和 SQL Server 之间的数据链接

mssql-jdbc MS SQL Server JDBC 驱动程序准备好的语句缓存性能问题与 Hikari CP

SQL Server的优化器会缓存标量子查询结果集吗