存储过程是一组完成特定功能的SQL 语句集合,经编译后存储在数据库中。
 
存储过程作为一个单元进行处理并以一个名称来标识。它能向用户返回数据、向数据库表中写入或修改数据等操作。
用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
 
 

存储过程的作用

执行速度快;
减少网络流量;
作为一种安全机制。通过设置用户只可能使用存储过程访问数据,限制用户不能直接操作数据库中的敏感数据,以保障数据的安全性;
屏蔽T-SQL命令,提供交互查询的客户接口,增加数据库应用的方便性。
 
 

存储过程和函数的异同

 
本质上没区别。
不同:
函数只能返回一个变量的限制。而存储过程可以返回多个。
函数是可以嵌入在SQL中使用的,可以在select中调用,而存储过程不行。
 
 

存储过程的种类

1. 系统存储过程  

   系统存储过程由系统提供,在安装SQL Server 2008 后自动装入,定义在系统数据master中,其存储过程名前缀是sp_。

2.  扩展存储过程 

   扩展存储过程用windows动态链接库实现,任何能够创建动态链接库的编程工具都可以用于创建扩展存储过程的dll,这就使得扩展存储过程的功能不收SQL语句的限制。其存储过程名前缀是xp_。

3.用户自定义存储过程

       用户自定义存储过程是在用户数据库中创建的存储过程,用以完成特定的数据库操作任务,也称为用户存储过程。本地存储过程通常只能应用于创建它的数据库,并且存储过程名不能使用sp_前缀,以免系统误解。

永久存储过程
临时存储过程
前缀“#”:局部临时存储过程
前缀“##”:全局临时存储过程
 
例如:
 SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*上两句是 SQL-92 设置语句,使 SQL Server 2000/2005/2008 遵从 SQL-92 规则。
--当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,
而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时,
标识符不可加引号,且必须符合所有 Transact-SQL 标识符规则。
SQL-92 标准要求在对空值进行等于 (=) 或不等于 (<>) 比较时取值为 FALSE。
当 SET ANSI_NULLS 为 ON 时,即使 column_name 中包含空值,
使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。
即使 column_name 中包含非空值,使用 WHERE column_name <> NULL 的
SELECT 语句仍会返回零行。
--当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从
SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name
中包含空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中包含非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有不为 XYZ_value 也不为 NULL 的行。
*/
----------------------- SET ANSI_NULLS ON --用于和NULL的比较,如:null=null在off时会返回true,在on时为false
SET QUOTED_IDENTIFIER ON --
go use test
go
----------------------------------------------------------------- /*系统存储过程*/ EXEC sp_who --显示当前用户、会话和进程的信息
EXEC sp_who sa EXEC sp_helpdb test --显示指定数据库的信息 EXEC sp_monitor --显示sql server的统计信息,
--比如上次运行sp_monitor的时间,
--当前运行sp_monitor的时间,cpu处理sql server工作所用的秒数等信息 EXEC sp_help --显示数据库对象信息
EXEC sp_help student --显示存储过程的参数及其数据类型 exec sp_helptext student --显示存储过程的定义 exec sp_depends sc --显示和存储过程相关的数据库对象 exec sp_stored_procedures --显示当前数据库中的存储过程列表
go
 
创建存储过程 

CREATE PROC[EDURE ] procedure_name

[ {@parameter data_type} [ = default]

[OUTPUT] ] [,…n]

[with {recompile|encryption|recompile,encryption}] [FOR REPLICATION]

AS

sql_statement […n ]

其中:

@parameter:过程中的参数。在该语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值,使用@符号作为第一个字符来指定参数名称。
data_type:参数的数据类型。
Default:参数的默认值。
OUTPUT:表明参数是返回参数。
Recompile: 该过程在运行时编译
 
例如:

 /*普通存储过程*/

 /*例: 创建存储过程maxgrade,输出所有学生的最高分:*/
create procedure maxgrade
as
begin
set nocount on -- 使返回的结果中不包含受Transact-SQL语句影响的行数的信息。
select max(grade) as '最高分' from sc
end
go select * from sc
exec maxgrade
go -- drop proc maxgrade
----------------------------------------------------------------------------------- use test /*临时存储过程*/
/*创建临时存储过程#s_g,检索所有学生的成绩记录,包括学号、姓名、所选课程号和成绩:*/ create procedure #s_g
as
select student.sno,student.sname,sc.cno,sc.grade
from student,sc
where student.sno=sc.sno
order by student.sno
go exec #s_g --执行该存储过程:
go
---------------------------------------------------------------------------------------------- /*加密存储过程*/
/*创建加密存储过程s_a,查询学生的平均年龄*/ create procedure s_a
with encryption
as
select avg(sage) from student go exec s_a
exec sp_helptext s_a
exec sp_helptext maxgrade
go
 
执行存储过程 
 
执行存储过程使用EXECUTE语句,其格式为:

[ [ EXEC [ UTE ] ]

{ [ @return_status =]

{ procedure_name| @procedure_name_var}

[ [ @parameter = ]

{ value|@variable[OUTPUT] | [DEFAULT]}]

[ , …n ]

[with recompile]}

各个参数的含义:
@return_status  保存存储过程的返回状态
procedure_name 调用的存储过程的名称
@parameter 过程参数
Value 过程参数的值
@variable 用来保存参数或返回参数的变量
OUTPUT 指定存储过程必须返回的一个参数
DEFAULT 默认参数值
 
 
存储过程的参数
 
1. 使用参数

带参数的存储过程的一般格式如下:

CREATE PROCEDURE 存储过程名( 参数列表 )

AS SQL语句

例如:

 /*带参数的存储过程*/
/*创建存储过程insert_sc向表中插入一条记录*/ CREATE PROCEDURE insert_sc(@sno int,@cno int,@grade int)
AS
INSERT INTO sc(sno,cno,grade) VALUES (@sno,@cno,@grade)
GO declare @a int --保存存储过程返回的状态;
exec @a=insert_sc 1,3,100 --带参数的存储过程的执行方式一
select @a
select * from sc --或
exec insert_sc @sno=2,@cno=3,@grade=99 --带参数的存储过程的执行方式二
select * from sc drop proc insert_sc
go
2. 使用默认参数
 
在设计存储过程时,可以为参数提供一个默认值,默认值必须为常量或者NULL。其一般格式如下:

CREATE PROCEDURE 存储过程名( 参数1=默认值1, 参数2=默认值2,… )

AS SQL语句

在调用存储过程时,如果不指定对应的实参值,则自动用对应的默认值代替。
 
例如:

 /*在存储过程中使用默认值*/

 create proc select_student(@sno int=1)
as
select student.sno,student.sname,sc.cno,sc.grade
from student,sc
where student.sno=@sno and student.sno=sc.sno
go exec select_student --不指定参数调用,则使用默认参数值1
exec select_student 2 --指定参数调用 drop proc select_student
go
 
 
3. 使用返回参数

在创建存储过程时,可以定义返回参数。在执行存储过程时,可以将结果给返回参数。返回参数用OUTPUT进行说明。

例如:

 /*例:创建一个存储过程average,它返回两个参数@st_name和@st_avg,
分别代表了姓名和平均成绩,即查询指定学号的学生的姓名和平均成绩*/ create procedure average
(@st_sno int,
@st_sname char(10) output,
@st_avg float output)
as
select @st_sname=student.sname, @st_avg=avg(sc.grade)
from student,sc
where student.sno=sc.sno and student.sno=@st_sno
group by student.sname
go --执行以上存储过程average,查询学号为“1”的学生姓名和平均分:
declare @st_sname char(10), @st_avg float
exec average 2,@st_sname output, @st_avg output
select @st_sname as '姓名', @st_avg as '平均分' --或select '平均分'=@st_avg
go --drop proc average
go
4. 存储过程的返回值
 
存储过程在执行后都会返回一个整型值(称为“返回代码”),指示存储过程的执行状态。
如果执行成功,返回0;否则返回-1~-99之间的数值(例如-1表示找不到对象,-2表示数据类型错误,-5表示语法错误等)。
也可以使用RETURN语句指定一个返回值。
 
例如:

 /*存储过程在执行后都会返回一个整型值,如成功执行返回0;如失败则返回-1至-99*/
/*也可以使用return语句来指定一个返回值*/ /*例: 创建存储过程maxgrade,输出所有学生的最高分:*/
create procedure maxgrade1
as
begin
set nocount on -- 使返回的结果中不包含受Transact-SQL语句影响的行数的信息。
select max(grade) as '最高分' from sc
end
go declare @ret_int int --保存返回值
exec @ret_int=maxgrade1 --执行该存储过程
print @ret_int drop proc maxgrade1
 
在调用存储过程时的两种传递参数的方式:
方式一:

EXEC 存储过程名 实参列表

方式二:

EXEC 存储过程名 参数1=值1,参数2=值2,…

例如:

 /*例: 创建存储过程test_ret根据输入的参数来判断返回值:*/
create proc test_ret(@input_int int=0)
as
begin
if @input_int=0
return 0 --输入的参数等于0,则返回0
if @input_int>0
return 1000 --输入的参数大于0,则返回1000
if @input_int<0
return -1000 --输入的参数大于0,则返回-1000
end declare @ret_int int --保存返回值
exec @ret_int=test_ret 1 --执行该存储过程
print '返回值'
print '--------'
print @ret_int declare @ret_int int --保存返回值
exec @ret_int=test_ret 0
print @ret_int declare @ret_int int --保存返回值
exec @ret_int=test_ret -1
print @ret_int drop proc test_ret

查看、修改和删除存储过程

 
使用SQL Server管理控制器查看或修改存储过程
使用sp_helptext存储过程来查看存储过程的定义信息
使用SQL Server管理控制器删除存储过程
使用DROP PROCEDURE删除存储过程
 
例如:

 /*修改存储过程*/
/*修改存储过程s_a,查询学生的最大年龄,不加密了!*/ alter procedure s_a
as
select max(sage) from student
go exec s_a
exec sp_helptext s_a
go
---------------------------------------------------------------------------------------------- /*删除存储过程*/ drop procedure s_a
 /*例:编写一个程序,先创建一个存储过程studproc,输出95031班的所有学生,
利用sysobjects和syscommnts两个系统表输出该存储过程的id和text列。
然后利用ALTER PROCEDURE语句修改该存储过程,将其改为加密方式,最后在输出该存储过程的
id和text列。*/ use school
go create procedure studproc
as
select * from student where sclass=''
go --通过以下语句输出studproc存储过程的id和text列
select sysobjects.id,syscomments.text
from sysobjects,syscomments
where sysobjects.name='studproc' and sysobjects.type='p' and sysobjects.id=syscomments.id --修改该存储过程:
alter procedure studproc
with encryption
as
select * from student where sclass=''
go --再通过以下语句输出studproc存储过程的id和text列
select sysobjects.id,syscomments.text
from sysobjects,syscomments
where sysobjects.name='studproc' and sysobjects.type='p' and sysobjects.id=syscomments.id --------------------------------- /*例: 更名用户存储过程studproc1为studproc*/ use school
go exec sp_rename studproc,studproc1 --------------------------------- /*使用DROP PROCEDURE语句删除用户存储过程stud_degree和stud1_degree。*/ USE school
GO
DROP PROCEDURE stud_degree,stud1_degree
GO

存储过程示例:

 /*示例:

 下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、
出版的书籍以及出版社。该存储过程不使用任何参数。*/ CREATE PROCEDURE au_info_all
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
GO
/*该存储过程可以通过以下方法执行:*/ EXECUTE au_info_all
-- Or
EXEC au_info_all /*如果该过程是批处理中的第一条语句,则可使用:*/ au_info_all ---------------------------------
/*下面的存储过程从四个表的联接中只返回指定的作者(提供了姓名)、出版的书籍以及出版社。
该存储过程接受与传递的参数精确匹配的值。*/ USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info' AND type = 'P')
DROP PROCEDURE au_info
GO
USE pubs
GO
CREATE PROCEDURE au_info
@lastname varchar(40),
@firstname varchar(20)
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
WHERE au_fname = @firstname
AND au_lname = @lastname
GO /*au_info 存储过程可以通过以下方法执行:*/ EXECUTE au_info 'Dull', 'Ann'
-- Or
EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
EXECUTE au_info @firstname = 'Ann', @lastname = 'Dull'
-- Or

sql server存储过程编程的更多相关文章

  1. SQL Server 存储过程(转载)

    SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...

  2. (摘录)SQL Server 存储过程

    文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...

  3. SQL Server存储过程中使用表值作为输入参数示例

    这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...

  4. SQL Server存储过程Return、output参数及使用技巧

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  5. 14、SQL Server 存储过程

    SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...

  6. Sql Server 存储过程中查询数据无法使用 Union(All)

    原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...

  7. Yii2.0调用sql server存储过程并获取返回值

    1.首先展示创建sql server存储过程的语句,创建一个简单的存储过程,测试用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE P ...

  8. C# 调用存储过程 Sql Server存储过程 存储过程报错,程序中的try

    C#程序调用Sql Server存储过程,存储过程中报错情况,返回值... 0.SQL存储过程 USE [Opos] GO /****** Object: StoredProcedure [dbo]. ...

  9. sql server 存储过程使用游标记录

    sql server 存储过程使用游标记录--方便下次参考使用 游标的组成: 声明游标 打卡游标 从一个游标中查找信息 关闭游标 释放游标 游标类型: 静态游标 动态游标 只进游标 键集驱动游标 静态 ...

随机推荐

  1. 烂泥:CentOS6.5挂载windows共享文件夹

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 由于工作需要,需要把本机的文件夹共享出去,然后让CentOS服务器临时使用下. 服务器使用的是CentOS系统,而本机使用的win7系统.考虑到是临时使 ...

  2. A coroutine example: Streaming XML parsing using xml_parser

    <?php error_reporting(E_ALL); /* Data can be send to coroutines using `$coroutine->send($data) ...

  3. /proc/interrupts 统计2.6.38.8与3.10.25差异

    eth4进,eth5出 linux-3.10.25 67:          2          3          2          3   PCI-MSI-edge     eth468: ...

  4. proteus 查找 仿真元件 中英文对照 [持续更新]

    CRYSTAL 晶振 CAP 电容 RES 电阻 LED 灯 DIODE 二极管 POWER 电源 GND   接地 SPEAKER 扬声器 AT89C51   51 CPU芯片 三极管 PNP  N ...

  5. MMORPG大型游戏设计与开发(客户端架构 part14 of vegine)

    渲染在客户端中具有着至关重要的地位,试想我们玩游戏的第一感觉是什么就会明白了,良好的画面效果对客户端来说是多么的迫切.没有学习过opengl或是direct3d这些渲染API的朋友们也不必担心,而学习 ...

  6. 分页查询的两种方法(双top 双order 和 row_number() over ())

    --跳过10条取2条 也叫分页select top 2 * from studentwhere studentno not in (select top 2 studentno from studen ...

  7. codevs 1082 线段树练习3

    1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 给你N个数,有两种操作: 1: ...

  8. 开发Adobe AIR移动应用程序的考虑事项

    http://www.adobe.com/cn/devnet/air/articles/considerations-air-apps-mobile.html Adobe AIR 经过发展演进,已经超 ...

  9. java之多线程之一/序列化和反序列化

    线程安全: 如何自己手动创建一个线程 答:继承Thread类或实现Runnable接口 public class Mythread extends Thread{ @Override public v ...

  10. Eclipse调整双击选取的字符颜色背景

    Eclipse调整双击选取的字符颜色背景,如下图所示: 会有二点影响: 1. 编辑页的颜色 2. 右侧滚动条的小提示点的颜色.