存储过程
定义:存储过程是一组为了完成特定功能的SQL语句集合,它经编译后存储在数据库中,用户通过制定存储过程的名称并给出相应的参数就可以对其进行执行
SQLSERVER 2008主要包括用户自定义存储过程,扩展存储过程和系统存储过程
接受输入参数并以输出参数的格式向调用过程或者批处理返回多个值
包含用于在数据库中执行操作(包括调用其他存储过程) 的编程语句
向调用过程或者批处理返回状态值,以知明成功或者失败
用户自定义存储过程
用户自定义存储过程是指封装了可重用代码的模块或者例程。存储过程可以接受输入参数,向客户端返回表格或者标量结果和消息,调用数据定义语言DDL和数据操作语言DML语句,然后返回输出参数。2008中用户自定义的存储过程有两种类型:Transact-SQL或CLR
Transact-SQL存储过程是指保存的Transact-SQL语句集合,可以几首和返回用户提供的参数
CLR存储过程是指对Microsoft.NET Frabnmework公共语言运行时(CLR)方法的引用,可以接受和返回用户提供的参数。
扩展存储过程允许使用编程语言创建自己的外部例程。扩展存储过程是指08的实例可以动态加载和运行DLL。在sql08实例的地址空间中运行,可以使用SQL SERVER 扩展存储过程API完成编程
系统存储过程
SQL SERVER 2008许多管理活动都通过一种特殊的存储过程执行,这种存储过程称为系统存储过程。从物理意义上来说,系统存储过程存储在源数据库中,并且都带有sq_前缀。从逻辑意义上来讲,系统存储过程出现在每个系统自动以数据库和用户自定义数据库的sys架构中
SQL SERVER 08中系统存储过程放在master数据库中,但是仍可以在其他数据库中对其进行调用,而且在调用时不必在存储过程名钱加上数据库名。
1.sp_who存储过程
用于查看当前用户,会话和进程的信息。可以筛选信息以便只返回那些属于特定用户或者特定会话的非空闲进程。具体语法格式如下:
sp_who [ [@loginame = ] 'login' | session ID | 'ACTIVE']
其中login用于标识属于特定登录名的进程,session ID是属于sql server实例的会话标识号,ACTIVE排除正在等待用户发出下一个命令的会话
下面是我查看的信息
use web go EXEC sp_who go select count(title) FROM dbo.web
2.sp_helpdb存储过程
sp_helpdb 存储过程用于报告有关指定数据库或所有数据库的信息,具体语法格式如下
sp_helpdb [ [@dbname= ] 'name']
当然上面的语句是刚才执行的最后一个就是啦
use web go EXEC sp_who go select count(title) FROM dbo.web EXEC sp_helpdb web
sp_monitor存储过程
用于显示有关Microsoft SQL Server的统计信息,语法格式如下
sp_monitor
这里我的权限太小了,报错信息如下
EXEC sp_monitor
[Err] 42000 - [SQL Server]拒绝了对对象 'sp_monitor' (数据库 'mssqlsystemresource',架构 'sys')的 EXECUTE 权限。
执行该操作必须有sysadmin固定服务器角色的成员身份
创建存储过程
可以使用 CREATE PROCEDURE语句来创建存储过程。必须有CREATE PROCEDURE权限才能创建存储过程,存储过程是架构作用域中的对象,只能在本地数据库中创建存储过程。在创建存储过程时,应该指定所有的输入参数,执行数据库操作的编程语句,返回至调用过程或者批处理时以示成或是失败的状态值,俘获和处理潜在错误时错误处理语句
存储过程创建规则
存储过程创建规则如下
(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)如果执行的存储过程将调用另一个存储过程,则被调用的存储过程可以访问由第一个存储过程创建的所有对象
(6)如果执行远程Microsoft SQL Server 2008 实例更改远程存储过程,则不能回滚更改
(7)存储过程中参数的最大数目为 2100
(8)存储过程中的局部变量最大数目仅受可用内存的限制
(9)根据可用内存的不同,存储过程最大可达128MB
创建简单存储过程
语法如下
CREATE PROC[EDURE] procedure_name[;number]
[{@parameter data_type}
[VARYING] [=default] [OUTPUT] ] [,...N]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE,ENCRYPTION}
]
[FOR REPLICATION]
AS sql_statement[...n]
下面简单介绍语法中的各参数含义
procedure_name 用于指定存储过程的名称
number 用于指定对同名的过程分组
@parameter 用于指定存储过程中的参数
data_type 用于指定参数 的数据类型
VARYING 指定作为输出参数支持的结果集,仅适用于游标参数
OUTPUT 指示参数是输出参数
RECOMPILE 指示数据库引擎不缓存该过程的计划,该过程在运行时编译
ENCRYPTION 指示SQL Server加密syscomments标识包含CREATE PROCEDURE语句文本的 条目
FOR REPLICATION 指定不能在订阅服务器上执行为复制的存储过程
sql_statement 要包含的过程中的一个或者多个Transact-SQL语句
下面创建一个简单的存储过程
use web GO CREATE PROCEDURE Pro_基本信息 AS SELECT 学号,姓名,出生日期,所属班级 FROM 学生信息 WHERE 性别='女' EXEC Pro_基本信息
-- ---------------------------- -- Table structure for 学生信息 -- ---------------------------- create TABLE [dbo].[学生信息] GO CREATE TABLE [dbo].[学生信息] ( [学号] nchar(10) NULL , [姓名] nvarchar(50) NULL , [出生日期] date NULL , [所属班级] nchar(10) NULL , [性别] nchar(10) NULL ) GO -- ---------------------------- -- Records of 学生信息 -- ---------------------------- INSERT INTO [dbo].[学生信息] ([学号], [姓名], [出生日期], [所属班级], [性别]) VALUES (N'1 ', N'张三', N'2014-04-17', N'一年三班 ', N'男 ') GO GO INSERT INTO [dbo].[学生信息] ([学号], [姓名], [出生日期], [所属班级], [性别]) VALUES (N'5 ', N'天八', N'2014-04-17', N'一年三班 ', N'女 ') GO GO INSERT INTO [dbo].[学生信息] ([学号], [姓名], [出生日期], [所属班级], [性别]) VALUES (N'3 ', N'王五', N'2014-04-13', N'一年三班 ', N'女 ') GO GO INSERT INTO [dbo].[学生信息] ([学号], [姓名], [出生日期], [所属班级], [性别]) VALUES (N'7 ', N'狗仔', N'2014-04-12', N'一年三班 ', N'男 ') GO GO INSERT INTO [dbo].[学生信息] ([学号], [姓名], [出生日期], [所属班级], [性别]) VALUES (N'2 ', N'李四', N'2014-04-17', N'一年三班 ', N'女 ') GO GO INSERT INTO [dbo].[学生信息] ([学号], [姓名], [出生日期], [所属班级], [性别]) VALUES (N'6 ', N'王小明', N'2014-04-13', N'一年三班 ', N'男 ') GO GO INSERT INTO [dbo].[学生信息] ([学号], [姓名], [出生日期], [所属班级], [性别]) VALUES (N'4 ', N'陈东', N'2014-04-12', N'一年三班 ', N'男 ') GO GO INSERT INTO [dbo].[学生信息] ([学号], [姓名], [出生日期], [所属班级], [性别]) VALUES (N'12 ', N'陈哥', N'2014-04-17', N'一年三班 ', N'女 ') GO GO INSERT INTO [dbo].[学生信息] ([学号], [姓名], [出生日期], [所属班级], [性别]) VALUES (N'13 ', N'王兄', N'2014-04-13', N'一年三班 ', N'男 ') GO GO INSERT INTO [dbo].[学生信息] ([学号], [姓名], [出生日期], [所属班级], [性别]) VALUES (N'15 ', N'吕雉', N'2014-04-12', N'一年三班 ', N'中性 ') GO GO
使用存储过程
指定参数名称和数据类型
首先来了解参数的定义,sql server 2008 的存储过程可以使用两种类型的参数:输入参数和输出参数
输入参数:允许用户将数据传递到存储过程或者函数
输出参数:允许存储过程将数据值或者游标变量传递给用户
存储过程的参数在创建时应在CREATE PRODURCE 和AS关键字之间定义,每个参数都要定义参数名和数据类型,参数名前必须@符号为前缀,各个参数定义之间用逗号隔开。
语法如下:
@parameter_name data_type [=default] [OUTPUT]
创建一个指定参数名称和数据类型的存储过程如下:
use web go CREATE PROCEDURE Pro_教师信息 @age int,@sex nchar(10) AS SELECT 教师编号,姓名,性别,年龄,籍贯 FROM 教师信息 WHERE 年龄=@age AND 性别=@sex
安位置传递,直接给出参数的值。当有多个参数时,给出的参数顺序与创建存储过程语句中的参数顺序一致
如下
go EXEC Pro_教师信息 25,'女' 通过参数名传递 执行存储过程的语句中,使用“参数名=参数值”,存储过程如下 EXEC Pro_教师信息 @sex='女',@age=24
输入参数
输入参数是指自啊存储过程中设置一个条件,在执行存储过程时为这个条件指定值,通过存储过程返回相应的信息。使用输入参数可以向同一存储过程多次查找数据库
执行存储过程
Microsoft SQL Server 2008 系统中,通常用EXECUTE 语句执行存储过程,简写为EXEC。如果将要执行的存储过程需要参数,应该在存储过程名称后面带上参数值。
1.通过存储过程自身执行
可以通过调用带有存储过程名和任意参数的EXECUTE语句执行一个存储过程。
[EXEC[UTE]]
{
[@return_status=]
{procedure_name[;number] | @procedure_name_var}
[[@parameter=] {value | @variable[OUTPUT] | [DEFAULT]}
[,...n]
[WITH RECOMPILE]
直接方式
该方式在EXEC语句中直接为存储过程的参数提供数据值,并且这些数据值的数量和顺序与定义存储过程时参数的数据和顺序相同。
EXEC Pro_教师信息 25,'女'
在执行语句中,为各个参数指定具体值,并且这些数据值的数量和顺序与定义存储过程时参数的数据和顺序相同
间接方式
该方式是指在执行EXEC语句之前,声明参数并且为这些参数赋值,然后在EXEC语句中引用这些已经获取数据值的参数名称
例如,使用EXEC语句执行存储过程之前,使用DECLARE语句声明两个变量,然后使用SET语句为已声明的变量赋值,最后在EXEC语句中引用变量的名称为存储过程的参数值
use web go DECLARE @sex1 nchar(10),@Agel NCHAR(10) SET @sex1='女' SET @Agel='24' EXEC Pro_教师信息 @sex='女',@age=24
在INSERT语句中执行
INSERT语句是指将本地或者远程存储过程返回的结果集加入到一个本地表中。SQL SERVER 将存储过程中的SELECT语句返回的数据载入表中,条件是表必须存在,并且数据类型必须匹配
下边是我的一张表 教师信息
建表语句和数据
CREATE TABLE [dbo].[教师信息] ( [教师编号] varchar(10) NOT NULL , [姓名] nvarchar(50) NULL , [出生日期] datetime2(7) NULL , [所属班级] nchar(10) NULL , [性别] nchar(10) NULL , [年龄] int NULL , [籍贯] nchar(10) NULL ) GO -- ---------------------------- -- Records of 教师信息 -- ---------------------------- INSERT INTO [dbo].[教师信息] ([教师编号], [姓名], [出生日期], [所属班级], [性别], [年龄], [籍贯]) VALUES (N'1 ', N'吕布', N'1989-02-15 22:21:04.0000000', N'一年三班 ', N'男 ', N'25', N'海南 ') GO GO INSERT INTO [dbo].[教师信息] ([教师编号], [姓名], [出生日期], [所属班级], [性别], [年龄], [籍贯]) VALUES (N'12 ', N'王莽', N'1990-10-23 01:31:25.0000000', N'一年三班 ', N'女 ', N'24', N'上海 ') GO GO INSERT INTO [dbo].[教师信息] ([教师编号], [姓名], [出生日期], [所属班级], [性别], [年龄], [籍贯]) VALUES (N'13 ', N'赵虎', N'2004-06-22 12:21:26.0000000', N'一年三班 ', N'男 ', N'10', N'北京 ') GO GO INSERT INTO [dbo].[教师信息] ([教师编号], [姓名], [出生日期], [所属班级], [性别], [年龄], [籍贯]) VALUES (N'15 ', N'吕雉', N'2000-02-15 05:02:00.0000000', N'一年三班 ', N'中性 ', N'14', N'越南 ') GO GO INSERT INTO [dbo].[教师信息] ([教师编号], [姓名], [出生日期], [所属班级], [性别], [年龄], [籍贯]) VALUES (N'2 ', N'李四', N'1990-06-26 07:56:32.0000000', N'一年三班 ', N'女 ', N'25', N'北朝鲜 ') GO GO INSERT INTO [dbo].[教师信息] ([教师编号], [姓名], [出生日期], [所属班级], [性别], [年龄], [籍贯]) VALUES (N'3 ', N'王五', N'1990-02-20 18:46:56.0000000', N'一年三班 ', N'女 ', N'25', N'长春 ') GO GO INSERT INTO [dbo].[教师信息] ([教师编号], [姓名], [出生日期], [所属班级], [性别], [年龄], [籍贯]) VALUES (N'4 ', N'陈东', N'1993-10-20 15:10:41.0000000', N'一年三班 ', N'男 ', N'21', N'嘉定 ') GO GO INSERT INTO [dbo].[教师信息] ([教师编号], [姓名], [出生日期], [所属班级], [性别], [年龄], [籍贯]) VALUES (N'5 ', N'天八', N'1908-06-23 03:08:00.0000100', N'一年三班 ', N'女 ', N'94', N'饱和 ') GO GO INSERT INTO [dbo].[教师信息] ([教师编号], [姓名], [出生日期], [所属班级], [性别], [年龄], [籍贯]) VALUES (N'6 ', N'王小明', N'1993-08-25 23:22:52.0000000', N'一年三班 ', N'男 ', N'21', N'武汉 ') GO GO INSERT INTO [dbo].[教师信息] ([教师编号], [姓名], [出生日期], [所属班级], [性别], [年龄], [籍贯]) VALUES (N'7 ', N'陈友谅', N'1889-05-21 00:53:39.0000000', N'一年三班 ', N'男 ', N'25', N'吉林 ') GO GO -- ---------------------------- -- Indexes structure for table 教师信息 -- ---------------------------- -- ---------------------------- -- Primary Key structure for table 教师信息 -- ---------------------------- ALTER TABLE [dbo].[教师信息] ADD PRIMARY KEY ([教师编号]) GO