SQL Server 中的存储过程是一组或多条 Transact-SQL 语句或对 Microsoft .NET Framework 公共运行时语言 (CLR) 方法的引用。 过程类似于其他编程语言中的构造,因为它们可以:
接受输入参数,并将输出参数形式的多个值返回给调用程序。
在数据库中执行操作的编程语句。 这包括调用其他过程。
将状态值返回到调用程序以指示成功或失败(以及失败的原因)。
使用存储过程的好处
以下列表描述了使用过程的一些好处。
减少服务器/客户端网络流量
过程中的命令作为代码的单个批处理执行。 这可以显著减少服务器和客户端之间的网络流量,因为只有对执行过程的调用才会跨网络发送。 如果没有过程提供的代码封装,每个单独的代码行必须跨网络。
更强的安全性
多个用户和客户端程序可以通过过程对基础数据库对象执行操作,即使用户和程序对这些基础对象没有直接权限。 过程控制执行哪些进程和活动,并且保护基础数据库对象。 这消除在了单独的对象级别授予权限的要求,并且简化了安全层。
可以在 CREATE PROCEDURE 语句中指定 EXECUTE AS 子句,以允许模拟其他用户,或者允许用户或应用程序执行某些数据库活动,而无需对基础对象和命令具有直接权限。 例如,某些操作(如 TRUNCATE TABLE)没有可授予的权限。 若要执行 TRUNCATE TABLE,用户必须具有对指定表的 ALTER 权限。 向用户授予对表的 ALTER 权限可能并不理想,因为用户实际上拥有的权限远远超出了截断表的能力。 通过在模块中合并 TRUNCATE TABLE 语句,并指定该模块以拥有修改表权限的用户身份执行,您可以将截断表的权限扩展到授予对模块的 EXECUTE 权限的用户。
通过网络调用过程时,只有执行该过程的调用可见。 因此,恶意用户看不到表和数据库对象名称、嵌入自己的 Transact-SQL 语句或搜索关键数据。
使用过程参数有助于防范 SQL 注入攻击。 由于参数输入被视为文本值而不是可执行代码,因此攻击者在过程内将命令插入 Transact-SQL 语句并损害安全性更为困难。
可以加密过程,帮助模糊化源代码。 有关详细信息,请参阅 SQL Server 加密。
重用代码
任何重复性的数据库操作代码都是过程封装的完美候选者。 这消除了对相同代码的不必要的重写,减少了代码不一致,并允许任何拥有必要权限的用户或应用程序访问和执行代码。
更容易维护
在客户端应用程序调用过程并且将数据库操作保持在数据层中时,对于基础数据库中的任何更改,只有过程是必须更新的。 应用程序层保持独立,无需了解如何对数据库布局、关系或进程进行任何更改。
提高了性能
默认情况下,过程在首次执行时编译,并创建一个用于后续执行的执行计划。 由于查询处理器不必创建新计划,因此处理过程通常需要更少的时间。
如果过程引用的表或数据发生了重大更改,预编译计划实际上可能会导致该过程执行速度较慢。 在这种情况下,重新编译过程并强制实施新的执行计划可以提高性能。
存储过程的类型
用户定义
可以在用户定义的数据库或除 Resource 数据库以外的所有系统数据库中创建用户定义的过程。 该过程可以在 Transact-SQL 中开发,也可以作为对 Microsoft .NET Framework 公共运行时语言 (CLR) 方法的引用进行开发。
临时
临时过程是用户定义的过程形式。 临时过程类似于永久性过程,但临时过程存储在 tempdb 中。 有两种类型的临时过程:本地和全局。 它们在名称、可见性以及可用性上有区别。 本地临时过程具有单一数字符号(#)作为其名称的第一个字符;它们仅对当前用户连接可见,并在连接关闭时将其删除。 全局临时过程具有两个数字符号(##)作为其名称的前两个字符;这些过程创建后,任何用户都可以访问它们,并在最后一个会话结束时将其删除。
系统
SQL Server 中包括系统过程。 它们以物理方式存储在内部、隐藏 的资源 数据库中,并逻辑显示在每个系统和用户定义的数据库的 sys 架构中。 此外, msdb 数据库还包含 dbo 架构中用于计划警报和作业的系统存储过程。 由于系统过程以前缀 sp_开头,因此建议在命名用户定义的过程时不要使用此前缀。 有关系统过程的完整列表,请参阅 系统存储过程(Transact-SQL)
SQL Server 支持系统过程,这些过程为各种维护活动提供从 SQL Server 到外部程序的接口。 这些扩展过程使用xp_前缀。 有关扩展过程的完整列表,请参阅常规扩展存储过程(Transact-SQL)。
扩展 User-Defined
扩展过程允许使用 C 等编程语言创建外部例程。这些过程是 SQL Server 实例可以动态加载和运行的 DLL。
注释
将在 SQL Server 的未来版本中删除扩展存储过程。 请勿在新的开发工作中使用此功能,并修改当前尽快使用此功能的应用程序。 请改为创建 CLR 过程。 此方法提供更可靠、更安全的替代方法,用于编写扩展过程。
相关任务
任务说明 | 主题 |
介绍如何创建存储过程。 | 创建存储过程 |
介绍如何修改存储过程。 | 修改存储过程 |
介绍如何删除存储过程。 | 删除存储过程 |
介绍如何执行存储过程。 | 执行存储过程 |
介绍如何授予对存储过程的权限。 | 授予对存储过程的权限 |
介绍如何将数据从存储过程返回到应用程序。 | 从存储过程返回数据 |
介绍如何重新编译存储过程。 | 重新编译存储过程 |
介绍如何重命名存储过程。 | 重命名存储过程 |
介绍如何查看存储过程的定义。 | 查看存储过程的定义 |
介绍如何查看存储过程的依赖项。 | 查看存储过程的依赖关系 |