例程(routine)是为了计算结果或执行任务而对代码进行封装的一种编程对象。SQL Server支持三种例程:用户定义函数,存储过程,触发器。

用户定义函数

用户定义函数(UDF,user-defined  function)的目的是要封装计算的逻辑处理,有可能需要基于输入的参数,并返回结果。

SQL Server支持两种用户定义函数:标量UDF和表值UDF。标量UDF只返回单个数据值。而表值UDF则返回一个表。使用UDF的优点之一是可以在查询中集成UDF。对于查询中返回单个值的表达式,在其出现的位置上,也能够使用标量UDF。表值UDF只能在查询的FROM子句中出现。

UDF不允许有任何副作用,副作用的含义是指不能对数据库中任何架构或者数据进行修改。

 

存储过程

存储过程是封装了T-SQL代码的服务端例程。存储过程可以有输入和输出参数,也可范湖多个查询的结果集。通过存储过程不但可以对数据进行修改,也可以对数据库架构进行修改。

和普通代码相比,存储过程有以下好处:

  1. 存储过程可以封装逻辑处理。只需要修改数据库里的存储过程,所有用户都能使用修改后的版本。
  2. 存错过程可以提高执行效率。存储过程默认情况下是重用执行计划的,而SQL Server对其他特殊执行计划有更多限制。另一个好处是减少网络的传输流量。客户端只需要向数据库发送存储过程的名称和参数。服务器就换处理所有代码,向调用者只返回输出结果。
  3. 通过存储过程可以有更好的安全性
  4. 在存储过程中可以整合所有的错误处理

 

存储过程

函数

存储过程定义中的 参数可以为任意数据类型 ,包括用户定义的类型,同时过程还 可以拥有输出参数 ,用于返回任何数据类型的结果。

存储过程只能直接 返回整型值 ,通常用于显示过程执行的状态。

在存储过程定义中可以 包含任何 T-SQL 语句 , 可以向用户返回查询的结果集 , 允许递归 (最大 32 层), 可以创建 / 引用临时表 。

存储过程的参数有默认值时,只要在调用存储过程时 不指定该参数的值 或将 DEFAULT 关键字指定为该参数的值,即可使用默认值。

存储过程 不能用于表达式 、计算列、 DEFAULT 约束和 CHECK 约束中。

系统内置的存储过程 有以下特点:其 名称以 sp_ 开头 , 存储在 MASTER 数据库中 。并且符合以上条件的用户定义存储过程可以在任何数据库下,不需要提供四部分名,即可被调用。

函数定义中的 参数不能是   timestamp 、 cursor 、 table 和 用户定义的数据类型 ,且 没有输出参数 。

函数可以 直接返回除 LOB 、 cursor 、 table 、 timestamp   外任何数据类型的值 。

在函数定义中 不能有修改函数外对象的 T-SQL 语句 , 不能向用户返回任何结果集 , 不允许递归 , 不能创建 / 引用临时表 。

函数的参数有默认值时,在调用函数时必须将 DEFAULT 关键字 指定为该参数的值,才可以使用默认值。

函数可以用于表达式、计算列、 DEFAULT 约束和 CHECK 约束中。

系统内置的函数 有以下特点:其 名称以 fn_ 开头 ,名称都是小写字母, 存储在 MASTER 数据库 中,其所有者为 system_function_schema 。在调用系统内置的表值函数时,需要加 :: 前缀。需要启用 allow updates 服务器选项 ,才能将用户定义函数的所有者定义为   system_function_schema 。