Sql 用户定义函数相对于存储过程的优势

Sql 用户定义函数相对于存储过程的优势,sql,sql-server,Sql,Sql Server,我对用户定义的函数有些怀疑。我想知道为什么/何时使用函数 与存储过程相比,函数有哪些优点 通过谷歌搜索,我看到一些文章建议: 存储过程比函数更有利 函数具有有限的错误处理 函数不能使用临时表 函数不能调用存储过程 函数的唯一优点是我们可以使用函数作为内联查询 通过使用临时表,我可以获得与存储过程相同的结果,但我需要知道与存储过程相比,使用函数的场景是什么。 我需要知道为什么我们需要UDf,而UDf提供的大部分功能都可以通过存储过程完成。 有谁能给我指点一下。主要的区别(优点)是,您可以内联调

我对用户定义的函数有些怀疑。我想知道为什么/何时使用函数

与存储过程相比,函数有哪些优点

通过谷歌搜索,我看到一些文章建议:

  • 存储过程比函数更有利
  • 函数具有有限的错误处理
  • 函数不能使用临时表
  • 函数不能调用存储过程
函数的唯一优点是我们可以使用函数作为内联查询

通过使用临时表,我可以获得与存储过程相同的结果,但我需要知道与存储过程相比,使用函数的场景是什么。 我需要知道为什么我们需要UDf,而UDf提供的大部分功能都可以通过存储过程完成。 有谁能给我指点一下。

主要的区别(优点)是,您可以内联调用函数,而不是像存储过程那样调用函数 e、 g

用户定义的函数可以返回表类型数据,然后可以在查询中调用该函数,如上所示。对于存储过程,您必须执行它并将结果存储到临时表中,以便进一步操作/查询结果集

另一方面,是的,您在函数中所能做的事情是有限的。e、 g.您不能使用动态sql,在sql 2005之前,您不能在函数中使用非确定性函数,如GETDATE()

例如,当您可能想要使用函数时,可以像上面的第一个示例中所示那样包装常见的“格式化”功能-而不是在每个查询中重复将名字和姓氏格式化为一个的逻辑,而是将其包装在一个函数中并到处调用。通常,我建议将格式设置留给UI,但这只是一个简单的示例,说明了您可能使用的位置/原因


另外,不必创建临时表来保存存储过程的结果以便进一步查询,这通常会更好。如果存储过程更改并返回更多列,则还需要更改将结果加载到临时表中的所有位置,以便将用于保存结果的表的架构与返回的新架构同步。函数方法没有这个问题,因为没有要维护的临时表。

有三种类型的函数:标量、内联表和表值。一般来说,标量和表值函数可能会导致性能问题,因为查询优化程序在优化这些类型函数的使用方面做得不是很好。然而,内联表函数的性能还不错

此处存在创建新类型标量函数的Connect请求:


我希望人们会投票支持这一点,因为它将通过允许查询优化程序内联函数表达式和利用统计信息等大大提高性能,就像对普通查询一样。

用户定义函数的主要“缺点”是每行都会调用它们。因此,如果您在选择列表中有这样一个函数,并且您在较大的集合上操作,那么您的性能很可能会受到影响

Mysql存储过程的优势

  • 多个应用程序在多个环境中运行,需要使用同一个数据库。通过使用存储过程,您可以使业务逻辑独立于编程语言

  • 当安全性是主要问题时,存储过程的使用至关重要。通过数据库执行操作,可以记录所有执行的操作。银行网站就是最好的例子

  • 如果您使用的是存储过程,那么您就不能直接访问表,这是保护数据和事务的另一种方法

  • 存储过程有时会提高应用程序的性能

  • 如果您的应用程序很大,或者您的数据库服务器位于远程系统上,那么通过使用存储过程,您可以减少数据库服务器和应用程序服务器之间的通信量

  • 由于存储过程是在数据库服务器中编写的,应用程序会单独调用它,因此可重用性的程度也会相应提高


  • 不完全正确。这取决于我们的SQL Server版本,您是否可以在函数中使用GETDATE()之类的东西……但您是否能够在SELECT子句中包含存储过程……如果不能,那么在比较两者时,这是一个什么缺点?
    SELECT dbo.fxnFormatName(FirstName, LastName) AS FormattedName
    FROM MyTable
    
    SELECT * 
    FROM dbo.fxnTableReturningFunction() x