SQLServer用户定义的函数与存储过程视图的区别.doc

SQLServer用户定义的函数与存储过程视图的区别.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
SQL Server 用户定义的函数用户定义的函数 (UDF) 是准备好的代码片段,它可以接受参数,处理逻辑,然后返回某些数据。根据 SQL Server Books Online,SQL Server? 2000 中的 UDF 可以接受从 0 到 1024 的任意个数的参数,不过我必须承认,我还未尝试将 1024 个参数传递到 UDF 中。UDF 的另一个关键特征是返回一个值。取决于 UDF 的类型,调用例程可以使用这个值来继续处理它的数据。因此,如果 UDF 返回单一值(标量值),调用例程就可以在任何能够使用标准变量或文字值的地方使用这个值。如果 UDF 返回一个行集,则调用例程可以循环访问该行集,联接到该行集,或简单地从该行集中选择列。 虽然现在大多数编程语言已经暂时支持函数,但只有 SQL Server 2000 引入了 UDF。存储过程和视图在 SQL Server 中可用的时间远早于 UDF,但这些对象中的每一个在 SQL Server 开发中都有自己适当的位置。存储过程可以很好地用于处理复杂的 SQL 逻辑、保证和控制对数据的访问,以及将行集返回到调用例程,无论此例程是基于 Visual Basic? 的程序,还是另一个 Transact-SQL (T-SQL) 批处理文件。与视图不同,存储过程是已编译的,这使得它们成为用来表示和处理频繁运行的 SQL 语句的理想候选者。视图可以很好地用于控制对数据的访问,但它们的控制方式与存储过程不同。视图仅限于生成该视图的基础 SELECT 语句中的某些列和行。因而视图常用于表示常用的 SELECT 语句,该语句可以联接多个表、使用 WHERE 子句,以及公开特定的列。在联接到其他表和视图的 SQL 语句的 FROM 子句中经常会发现视图。 在其核心部分,UDF 既类似于视图,也类似于存储过程。像视图一样,UDF 可以返回一个行集,该行集可用于 JOIN 中。因此,当 UDF 返回一个行集并接受参数时,它像一个您可以联接到的存储过程、或者一个参数化的视图。但是,正如我将演示的,UDF 可以做到这一点,甚至更多。 有两种主要的 UDF 类型:返回标量值的 UDF 和返回表值的 UDF。在表值 UDF 中,您将找到返回内联表和多语句表的 UDF(请参见图 1)。在以下部分中,我将对每种类型都加以关注。 标量 UDF 返回标量值的 UDF 最类似于许多编程语言所引用的作为函数的内容。它们返回由标量数据类型(例如,integer、varchar(n)、char(n)、money、datetime、bit,等等)组成的单一值。如果用户定义的数据类型 (UDDT) 基于标量数据类型,UDF 也可以返回这些数据类型。使用返回内联或多语句表的 UDF,可以通过表数据类型返回行集。然而,并非所有的数据类型都可以从 UDF 中返回。例如,UDF 无法返回下列数据类型中任何一个的值:text、ntext、image、cursor、或 timestamp。 返回标量数据类型的 UDF 可以用于多种情况,以使代码具有更好的可维护性、可重用性和更少的复杂性。当 T-SQL 代码的相同段在几个地方(可能由几个存储过程和批 SQL 语句)使用时,这会非常有用。例如,假定一个应用程序中的几个部分都需要查找产品是否必须重新订购。在每个需要此操作的地方,代码可以检查重新订购等级,并将它与库存量加订购量的和相比较。然而,因为这个代码在几个地方用到,所以可以改为使用 UDF 以减少代码块,并使得万一需要更改时维护函数更加容易。这样的 UDF 可能看起来像图 2 中的代码,并可以使用以下 SQL 语句进行调用: SELECT ProductID, ReorderLevel, UnitsInStock, UnitsOnOrder, dbo.fnNeedToReorder(ReorderLevel, UnitsInStock, UnitsOnOrder) AS sNeedToReorder FROM Products 在图 2 中,fnNeedToReorder UDF 执行计算并返回适当的值。这本来可以通过 CASE 语句在 SELECT 子句内完成,但如果改为使用 UDF,代码就会简洁得多。而且更容易传播到其他可能需要相同逻辑的地方。假定一个应用程序中有几个部分需要确定是否要重新订购产品,那么图 2 中的 UDF 确实变得有价值,因为它使得当逻辑改变时应用程序更容易维护。例如,重新订购已经终止的产品并不是很有意义。因此,通过更改 UDF 以说明这个业务规则,可以在一个地方更改此逻辑(请参见图 3)并使用下列代码运行: SELECT ProductID,

文档评论(0)

hzhplyvb8 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档