3.8.1 存储过程概述
存储过程(Stored Procedure)是为了实现特定任务,而将一些需要多次调用的固定Transact-SQL语句编写成程序段,这些程序段存储在服务器上。存储过程经过第一次编译后再次调用时不需要重新编译,用户只需通过使用存储过程并给定参数即可进行操作。存储过程可以包含用于在数据库中执行操作的编程语句,比如流程控制、数据查询等语句,还可以嵌套调用;存储过程可以接受输入参数并以输出参数的格式向调用程序返回多个值。
(1)存储过程的优点
与单纯的Transact-SQL语句相比,存储过程具有如下优点:
减少网络流量。一个需要数百行Transact-SQL语句的操作由一条执行存储过程代码的单独语句就可以实现,不需要在网络中发送数百行代码。
可实现模块化的程序设计。创建好的存储过程存储在数据库中,可以在应用程序中多次调用。存储过程一般由数据库编程技术人员创建,并可独立于程序源代码而单独修改。
执行速度快,改善系统性能。默认情况下,存储过程只需在创建时编译,以后每次执行时不需要重新编译。
存储过程可以封装复杂的数据库操作,简化操作流程。例如对多个表的更改和删除等操作可以定义成一个存储过程。
提供更强的安全性。多个用户和客户端程序可以通过存储过程对基础数据库对象执行操作,这消除了单独的对象级别授予权限的要求,并且简化了安全层。另外,通过网络调用过程时,只有对执行过程的调用是可见的,因此,恶意用户无法看到表和数据库对象名称,嵌入自己的Transact-SQL语句或搜索关键数据。
(2)存储过程的分类
在SQL Server中存储过程分为:系统存储过程、用户定义存储过程、临时存储过程、扩展存储过程等。
系统存储过程:系统存储过程是由SQL Server系统提供的存储过程,用户可以使用系统存储过程来执行许多管理和信息活动,如管理服务器、查看各数据库对象信息。系统存储过程物理上存储在内部隐藏的Resource数据库中,但逻辑上出现在每个系统定义数据库和用户定义数据库的sys架构中。系统存储过程以“sp_”开头,在调用时不必在存储过程名前加上数据库名。
用户定义存储过程:为了完成某特定的功能,用户可以在用户数据库中创建存储过程。用户定义存储过程有两种类型:Transact-SQL存储过程和CLR存储过程。Transact-SQL存储过程是指保存Transact-SQL语句的集合,可以接收和返回用户提供的参数;CLR存储过程是指针对Microsoft.NET Framework公共语言运行时(Common Language Runtime,CLR)方法的引用,可以接收和返回用户提供的参数,它们在.NET Framework程序集中是作为类的公共静态方法实现的。
临时存储过程:临时存储过程是用户定义存储过程的一种形式,与普通存储过程相似,只是临时存储过程存储于临时数据库tempdb中。临时存储过程有两种类型:本地临时存储过程和全局临时存储过程。本地临时存储过程名称以单个符号“#”开头,仅对当前的用户连接是可见的,当用户关闭连接时被删除;全局临时存储过程的名称以两个符号“##”开头,创建后对任何用户都是可见的,并且在使用该过程的最后一个会话结束时被删除。
扩展存储过程:扩展存储过程是SQL Server数据库的实例可以动态加载和运行的动态链接库(Dynamic Link Library,DLL),扩展了系统的性能,常以“xp_”开头。
(3)常用的系统存储过程
SQL Server系统提供了许多系统存储过程,主要包括用于SQL Server数据库引擎的常规维护的数据库引擎存储过程,用于实现游标变量功能的游标存储过程,用于设置管理数据库性能所需的核心维护任务的数据库维护计划存储过程等多种类型,常用的系统存储过程见表3-26。
表3-26 常用的系统存储过程
【例3.103】 使用系统存储过程SP_HELPTEXT查看例3.102中创建的函数Fun3的定义文本。
EXEC SP_HELPTEXT Fun3;
可能的执行结果为:
【例3.104】 使用系统存储过程SP_RENAME重命名例3.74中创建的索引Index1。