1、存储过程概述
什么是存储过程
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据为吕。存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。
为什么要使用存储过程?
1)存储过程与其他应用程序共享应用程序逻辑,因而确保了数据访问和修改的一致性。存储过程可以封闭业务功能,在存储过程中可以在同一位置改变封装的业务规则和策略。所有的客户端可以使用相同的存储过程来确保数据访问和修改的一致性
2)存储过程具有安全性和所有权链接,以及可以附加到它们的证书。用户可以被授予权限来执行存储过程而不必直接对存储过程中引用的对象具有权限
3)存储过程提供了安全机制。即使是没有访问存储过程引用的表或者视图的权限的用户,也可以被授权执行该存储过程。
4)存储过程允许模块化程序设计。存储过程一旦创建,以后即可在程序中调用任意多次。这可以改进应用程序的可维护性,并允许应用程序统一访问数据库
5)存储过程可以减少网络通信流量。用户可以通过发送一个单独的语句实现一个复杂的操作,而不需要在网络上发送几百个Transact-SQL代码,这样减少了在服务器和客户机之间传递的请求的数量
存储过程的种类
1)用户自定义的存储过程
2)系统存储过程
3)扩展存储过程
2、创建存储过程
语法格式
CREATE PROC[EDURE] procedure_name[;number]
[{@parameter date_type}
[VARYING][=default][OUTPUT]][,...n]
[WITH
{PECOMPILE|ENCRYPTION|PECOMPILE,ENCRYPTION}]
AS
sql_statement[...n]
CREATE procedure cp_GetAllCategory
AS
SELECT * FROM Category
--执行存储过程
exec cp_GetAllCategory
--带有参数的存储过程
CREATE procedure cp_GetCategoryById
@catId int
AS
SELECT * FROM Category where CatID=@catId
--执行存储过程
exec cp_GetCategoryById
@catId=2
3、使用带默认值的参数
CREATE PROC cp_TestPROCDefaultValue
@catId int = 2
AS
SELECT * FROM Category where CatID = @catId
--执行存储过程
exec cp_TestPROCDefaultValue
4、使用输出参数
CREATE PROC cp_GetParentIdFormCategoryById
@catId int,
@parentId int output
AS
select @parentId=parentId from Category where CatID = @catId
--定义输出参数的变量
declare @result int
--执行带输出参数的存储过程
exec cp_GetParentIdFormCategoryById
@catId=15,
@parentid = @result output
--打印输出参数的变量
print @result
5、修改存储过程
语法格式
ALTER PROC[EDURE] procedure_name[;number]
[{@parameter date_type}
[VARYING][=default][OUTPUT]][,...n]
[WITH
{PECOMPILE|ENCRYPTION|PECOMPILE,ENCRYPTION}]
AS
sql_statement[...n]
6、删除存储过程
语法格式
DROP PROC[EDURE] procedure_name
7、查看存储过程
使用系统存储过程查看存储过程:
exec sp_helptext procedure_name
8、存储过程示例(略)
9、临时存储过程
CREATE PROC #tmp_GetCategoryByID
@catId int
AS
SELECT * FROM Category where CatID = @catId
--执行局部临时存储过程
EXEC #tmp_GetCategoryByID
@catId = 2
--删除局部临时存储过程
DROP PROC #tmp_GetCategoryByID
--全局临时存储过程加##,即双#号,临时存储过程的作用范围参考临时表
10、系统存储过程
exec sp_who sa
--查看指定数据库信息(不带参数则返回所有库信息)
exec sp_helpdb TestDB
--查看数据库的统计信息
exec sp_monitor
print @@NESTLEVEL
12、设计存储过程的规则
规则:
1)可以引用在同一存储过程中创建的对象,只要引用时已经创建了该对象即可。
2)可以在存储过程内引用临时表。如果在存储过程内创建本地临时表,则临时表仅为该存储过程而存在;退出该存储过程后,临时表将消失。
3)如果执行的存储过程将调用另一个存储过程,则被调用的存储过程可以访问由第一个存储过程创建的所有对象,包括临时表在内。
4)如果执行对远程Microsoft SQL Server 2008实例进行更改的远程存储过程,则不能加滚这些更改。远程存储过程不参于事务处理。
5)存储过程中的参数最大数据为2100。
6)存储过程中的局部变量的最大数目仅受可用内存的限制。
7)根据可用内存的不同,存储过程最大可达128MB。
不能包括的T-SQL语句
1)Create AGGREGATE
2)Create RULE
3)Create DEFAULT
4)Create SCHEMA
5)Create 或者 ALTER FUNCTION
6)Create 或 Alter TRIGGER
7)Create 或者 Alter PROCEDURE
8)Create 或者 Alter VIEW
9)SET PARSEONLY
10)SET SHOWPLAN_ALL
11)SET SHOWPLAN_TEXT
12)SET SHOWPLAN_XML
13)USE DataBase_name