存储过程就是已经编译好的、优化过的放在数据库服务器中的一些SQL语句;可供应用程序直接调用。
存储过程
存储过程特点:
- (1)接受输入参数并以输出参数的格式向调用过程或批处理返回多个值。
- (2)包含用于在数据库中执行操作(包括调用其他过程)的编程语句。
- (3)向调用过程或批处理返回状态值,以指明成功或失败(以及失败的原因)。
- (4)可以使用 Transact-SQL EXECUTE 语句来运行存储过程。
- (5)存储过程与函数不同,因为存储过程不返回取代其名称的值,也不能直接在表达式中使用。
存储过程与T-SQL 比较优点:
- (1)执行速度比普通的SQL语句快。
- 存储过程是预编译的,在首次运行存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的执行计划。而批处理的T- SQL 语句在每次运行时都要进行编译和优化,因此速度相对要慢。
- (2)存储过程具有安全特性。
- 所有权链接,以及可以附加到它们的证书。用户可以被授予权限来执行存储过程而不必直接对存储过程中引用的对象具有权限.。存储过程可以强制应用程序的安全性。参数化存储过程有助于保护应用程序不受 SQL Injection 攻击。
- (3)存储过程允许模块化程序设计。
(4)存储过程是命名代码,允许延迟绑定。
(5)存储过程可以减少网络通信流量。
存储过程注意事项
- (1)CREATE PROCEDURE 定义自身可以包括任意数量和类型的 SQL 语句,但不能在存储过程的任何位置使用以下语句。
CREATE AGGREGATE/CREATE RULE/CREATE DEFAULT/CREATE SCHEMA/CREATE 或 ALTER FUNCTION/CREATE 或 ALTER TRIGGER/CREATE 或 ALTER PROCEDURE/CREATE 或 ALTER VIEW/SET PARSEONLY/SET SHOWPLAN_ALL/SET SHOWPLAN_TEXT/SET SHOWPLAN_XML/USE database_name
- 其他数据库对象均可在存储过程中创建。 可以引用在同一存储过程中创建的对象,只要引用时已经创建了该对象即可。
- (2)可以在存储过程内引用临时表。
- 如果在存储过程内创建本地临时表,则临时表仅为该存储过程而存在;退出该存储过程后,临时表将消失。
- (3)一个存储过程调用另一个存储过程,则被调用的存储过程可以访问由第一个存储过程创建的所有对象,包括临时表在内。
- (4) 远程存储过程不参与事务处理。
- (5)存储过程中的参数的最大数目为 2100。局部变量的最大数目仅受可用内存的限制。
存储过程的类型
(1)Transact-SQL
Transact-SQL 存储过程是指保存的 Transact-SQL 语句集合,可以接受和返回用户提供的参数。
(2)CLR存储过程
CLR 存储过程是指对 Microsoft .NET Framework 公共语言运行时 (CLR) 方法的引用,可以接受和返回用户提供的参数。它们在 .NET Framework 程序集中是作为类的公共静态方法实现的。
(3) 系统存储过程
SQL Server 2005 中的许多管理活动都是通过一种特殊的存储过程执行的,这种存储过程被称为系统存储过程。
存储过程的设计规则
当创建存储过程时,需要确定存储过程的三个组成部分;
- (1)所有的输入、输出参数。
- (2)要执行的数据操作语句,(可以包含调用其他存储过程的语句)。
- (3)返回给调用者的状态值,以指明调用是成功还是失败。
存储过程参考命名规则
注释:假如存储过程以sp_ 为前缀开始命名那么会运行的稍微的缓慢,这是因为SQL Server将首先查找系统存储过程,所以我们决不推荐使用sp_作为前缀。
存储过程的命名语法:
[proc] [MainTableName] By [FieldName(optional)] [Action]
(1) 所有的存储过程必须有前缀'proc'. 所有的系统存储过程都有前缀"sp_", 推荐不使用这样的前缀因为会稍微的减慢。
(2) MainTableName 是存储过程访问的主表。
(3) 可选字段名就是条件子句。 例如: procClientByCoNameSelect, procClientByClientIDSelect
(4) Action是存储过程要执行的任务。
(如返回一条记录那么后缀是:Select 、插入数据那么后缀是:Insert 、更新数据那么后缀是:Update 、有插入和更新那么后缀是:Save 、删除数据那么后缀是:Delete 、更新表中的数据 (ie. drop and create) 那么后缀是:Create 、返回输出参数或0,那么后缀是:Output)