不过,我的问题是,我读过的所有内容都表明sql Server会缓存存储过程的执行计划。没有提到表值函数。我认为它适用于视图(出于兴趣)。
每次调用表值函数时是否重新编译?
什么时候最好使用表值函数而不是存储过程?
多语句TVF有一个计划(将找到参考)。
如果要改变参数化输入的SELECT列表,TVF非常有用。内联TVF将被扩展,优化者将考虑外部选择/位置。对于多语句TVF,优化实际上是不可能的,因为它必须运行完成,然后过滤。
就个人而言,我会在多语句TVF上使用存储过程。它们更灵活(例如提示,可以更改状态,SET NOCOUNT ON,SET XACTABORT等)。
我不反对内联TVF,但由于无法使用SET和更改状态,因此不倾向于将它们用于面向客户端的代码。