内联表值函数与存储过程(SQL Server)

时间:2011-06-19 14:16:41

标签: sql-server-2008 stored-procedures user-defined-functions

我对在以下情况下最好使用什么感到困惑: 我有一个非常复杂的查询,用于报告目的。简化版看起来像

  SELECT [type], COUNT(*) as total_num, COUNT(DISTINCT user_id) as uq_user_num
  FROM table1
  INNER JOIN table2 ON (...)
  ...
  WHERE table3.last_action_date BETWEEN :start_date AND :end_date
  GROUP BY [type]

我可以创建一个内联函数或一个存储过程,它接受start_date和end_parameters并执行此查询。
我倾向于运行,因为此任务不涉及任何数据修改或复杂逻辑。另外,我可能想稍后使用APPLY中的结果(目前这并不重要) 使用功能,而不是程序是否有意义?是否与性能观点(执行计划缓存等)有任何区别?

谢谢。

2 个答案:

答案 0 :(得分:1)

使用多语句表值函数类似于使用来自计划缓存和缓存计划重用透视的pr​​oc。使用内联表值函数类似于使用计划缓存中的视图和计划重用透视图(仅重用)发生的是使用完全相同的语句。即相同的参数)。 考虑到相同,您应该使用多语句表值函数。

答案 1 :(得分:0)

您可能也想考虑使用View。如果结果在给定参数的情况下没有变化,则视图是有效的,这就是您在此处所拥有的。在这种情况下,如果您使用相同的开始和结束日期进行两次调用,结果将不会更改。

但是,存储过程和函数之间的两个主要区别是,您无法从函数调用更新/插入,并且您不能将存储过程调用为select语句的一部分,但您可以使用函数。 / p>

有关详细信息,请参阅此主题:

Function vs. Stored Procedure in SQL Server