存储过程的官方定义是这么说的:
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
其实说的再简单一点,她就是一个过程而已,对!就是和你所熟知的那个Sub……End Sub实质上是一个东西。
存储过程除了与一般的过程拥有同样的优点外(多次调用,可移植性好等),还在一定程度上减少了网络流量(只需要传送调用过程的语句);而且通过对执行存储过程的权限控制还能保证系统数据的安全等等,等等。
简而言之,使用存储过程存在很多好处,但是却没有明显的坏处。
OK!铺垫完毕,开始正式介绍——存储过程。(这里应该有掌声)
l 基本语法格式
n 创建存储过程
1: create proc 过程名/*建立存储过程*/<!--CRLF-->2: @parameter 参数类型 /*输入参数*/<!--CRLF-->3: ...
<!--CRLF-->4: @parameter 参数类型 output/*输出参数*/<!--CRLF-->5: ...
<!--CRLF-->6: as<!--CRLF-->7: begin<!--CRLF-->8: 命令行或命令块/*需要存储过程执行的操作*/<!--CRLF-->9: end
<!--CRLF-->n 执行存储过程
1: execute 过程名 [参数,参数……][output]<!--CRLF-->n 修改存储过程
1: alter proc 过程名*/修改存储过程*/<!--CRLF-->2: @parameter 参数类型 /*输入参数*/<!--CRLF-->3: ...
<!--CRLF-->4: @parameter 参数类型 ouput/*输出参数*/<!--CRLF-->5: ...
<!--CRLF-->6: as<!--CRLF-->7: begin<!--CRLF-->8: 命令行货命令块/*存储过程执行的操作*/<!--CRLF-->9: End<!--CRLF-->n 重命名存储过程
1: sp_rename 原过程名,新过程名
<!--CRLF-->n 删除存储过程
1: drop proc存储过程名,[存储过程名2,……]<!--CRLF-->l 存储过程在哪里?
无论是系统自带的存储过程(在数据库master中,以sp_开头)还是自定义的存储过程,都在相应数据库中的“可编译性”——“存储过程”中,可以点击查看。
PS:修改、重命名、删除存储过程也可以在相应数据库中的“可编译性”——“存储过程”中右键进行相应相关操作(看个人喜好)。
l 实战演练
1. 建立数据库(略)
2. 建立无参数存储过程
1: create proc proc1<!--CRLF-->2: as<!--CRLF-->3: begin<!--CRLF-->4: select a.StuNo,StuName,StuCollege,StuScore from Student a<!--CRLF-->5: where StuScore >90<!--CRLF-->6: end<!--CRLF-->3. 建立有参数存储过程
1: CREATE proc proc2<!--CRLF-->2: @coures varchar(20)<!--CRLF-->3: as<!--CRLF-->4: begin<!--CRLF-->5: select StuNo,StuName,StuCollege,StuScore from Student a<!--CRLF-->6: where StuScore=@Coures<!--CRLF-->7: end<!--CRLF-->4. 执行存储过程
1: execute proc1<!--CRLF-->2: execute proc2 '80'<!--CRLF-->附:对应数据脚本
1: USE [StuInfo]<!--CRLF-->2: GO<!--CRLF-->3: SET ANSI_NULLS ON<!--CRLF-->4: GO<!--CRLF-->5: SET QUOTED_IDENTIFIER ON<!--CRLF-->6: GO<!--CRLF-->7: SET ANSI_PADDING ON<!--CRLF-->8: GO<!--CRLF-->9: CREATE TABLE [dbo].[Student](<!--CRLF-->10: [StuNo] [varchar](50) NULL,<!--CRLF-->11: [StuName] [varchar](50) NULL,<!--CRLF-->12: [StuCollege] [varchar](50) NULL,<!--CRLF-->13: [StuScore] [varchar](50) NULL<!--CRLF-->14: ) ON [PRIMARY]<!--CRLF-->15: GO<!--CRLF-->16: SET ANSI_PADDING OFF<!--CRLF-->17: GO<!--CRLF-->18: INSERT [dbo].[Student] ([StuNo], [StuName], [StuCollege], [StuScore]) VALUES (N'1', N'丁福东', N'物电学院', N'80')<!--CRLF-->19: INSERT [dbo].[Student] ([StuNo], [StuName], [StuCollege], [StuScore]) VALUES (N'2', N'斯蒂芬', N'物电学院', N'75')<!--CRLF-->20: INSERT [dbo].[Student] ([StuNo], [StuName], [StuCollege], [StuScore]) VALUES (N'3', N'梵蒂冈', N'数信学院', N'98')<!--CRLF-->21: INSERT [dbo].[Student] ([StuNo], [StuName], [StuCollege], [StuScore]) VALUES (N'4', N'金凯华', N'国贸学院', N'69')<!--CRLF-->22: INSERT [dbo].[Student] ([StuNo], [StuName], [StuCollege], [StuScore]) VALUES (N'5', N'安淑霞', N'数信学院', N'78')<!--CRLF-->23: INSERT [dbo].[Student] ([StuNo], [StuName], [StuCollege], [StuScore]) VALUES (N'6', N'张成栋', N'生科学院', N'84')<!--CRLF-->24: INSERT [dbo].[Student] ([StuNo], [StuName], [StuCollege], [StuScore]) VALUES (N'7', N'安世伟', N'国贸学院', N'95')<!--CRLF-->25: INSERT [dbo].[Student] ([StuNo], [StuName], [StuCollege], [StuScore]) VALUES (N'8', N'任文才', N'生科学院', N'71')<!--CRLF-->26: INSERT [dbo].[Student] ([StuNo], [StuName], [StuCollege], [StuScore]) VALUES (N'9', N'秦福德', N'物电学院', N'54')<!--CRLF-->27: INSERT [dbo].[Student] ([StuNo], [StuName], [StuCollege], [StuScore]) VALUES (N'10', N'孙德荣', N'生科学院', N'68')<!--CRLF-->