SQL Server存储过程简介

1、存储过程的概念:

存储过程是一组预先写好的能实现某种功能的T-SQL程序,指定一个程序名并编译后将其存在SQL Server中,以后要实现该功能,可以调用这个程序来完成。

2、存储过程的分类:

系统存储过程、扩展存储过程、用户自定义存储过程。
(1)系统存储过程:一般以“sp_”为前缀,不要对其进行修改或删除。
(2)扩展存储过程:通常以“xp_”为前缀,尽量不要使用。
(3)用户自定义存储过程:可以输入参数、向客户端返货表格或结果、消息等,也可以返回输出参数。用户自定义存储过程有分为T-SQL存储过程和CLR存储过程两种。

3、在创建存储过程的时候,要确定三个组成部分:

(1)输入参数和输出参数
(2)在存储过程中执行的T-SQL语句
(3)返回的状态值,指明执行存储过程是成功还是失败

4、存储过程的参数:

在执行存储过程时,如果不指明参数名称,则按照存储过程定义的参数次序传递。

如果存储过程中定义了参数的默认值,并且放在最后,则传递参数时可以省略该参数值。

5、存储过程的返回值:

存储过程有三种不同的返回值:

(1)以“return n”的方式返回一个整数

(2)指定一个output的返回参数以返回值

(3)执行T-SQL语句返回数据集,例如select语句

6、创建存储过程中的注意事项:

(1)在存储过程中不能使用的一些语句:

(2)如果在存储过程中创建了临时表,只要存储过程退出了,临时表也就会被删除。

(3)在存储过程中,不但可以创建对象,还可以引用在该存储过程中已经定义好的对象。

(4)如果在一个存储过程中调用另一个存储过程,那么被调用的存储过程可以使用调用的存储过程里创建的对象,包括临时表。

(5)如果在存储过程中包含对远程SQL Server实例进行更改的T-SQL语句,一旦该语句执行后就不能回滚。

(6)存储过程中的参数最大数目为2100个,但存储过程中的局部变量的最大数目受内存的限制。

(7)存储过程最大可达128MB。

7、下面是一些例子:

------利用存储过程查询表-----

1 create proc pr_例一
2 as 
3 select * from StudentInfo
4 exec pr_例一
5 
6 go

-------带有参数的存储过程---------

 1 create proc pr_例二
 2 @stuId int
 3 as 
 4 begin
 5 select * from StudentInfo where id=@stuId
 6 end
 7 exec pr_例二 3
 8 exec pr_例二 @stuId=4
 9 
10 go

---------带有默认参数的存储过程----------

 1 create proc pr_例六
 2 @num int,
 3 @age int =18
 4 as
 5 select * from StudentInfo
 6 where num>@num and age>@age
 7 exec pr_例六 @num=3
 8 exec pr_例六 @num=3,@age=30
 9 exec pr_例六 3,10
10 
11 go

--------return n 方式的返回值---------

 1 create proc pr_例七
 2 as
 3 begin
 4 declare @返回值 int
 5 select @返回值=sum(age) from StudentInfo
 6 return @返回值
 7 end
 8 
 9 declare @sum int
10 exec @sum=pr_例七
11 print @sum
12 
13 go

---------output 方式的返回值----------

 1 create proc pr_例七_2
 2 @返回值 int output
 3 as
 4 select @返回值=sum(age) from StudentInfo
 5 
 6 declare @sum int
 7 exec pr_例七_2 @sum output
 8 print @sum
 9 
10 go

---------return n 方式的返回值只能返回整数-----------

 1 create proc pr_例七_3
 2 as
 3 declare @name varchar(10)
 4 select @name=name from StudentInfo
 5 where id=2
 6 return @name
 7 
 8 declare @n varchar(10)
 9 exec @n=pr_例七_3
10 print @n
11 ----执行存储过程时会出现以下的错误提示:
12 ----消息 245,级别 16,状态 1,过程 pr_例七_3,第 7 行
13 ----在将 varchar 值 '张四 ' 转换成数据类型 int 时失败。
14 
15 go

------output方式的返回值可以返回任何类型的数据------------

 1 create proc pr_例七_4
 2 @name varchar(10) output
 3 as
 4 select @name=name from StudentInfo
 5 where id=1
 6 
 7 declare @n varchar(10)
 8 exec pr_例七_4 @n output
 9 print @n
10 
11 go

-----临时存储过程--------

1 create proc #临时存储过程
2 as
3 select * from StudentInfo
4 
5 go

-----一个带有事务处理的存储过程------

 

 1 create proc pr_sample
 2 @money_limit int,
 3 @fee int,
 4 @free_money int,
 5 @area int,
 6 @time_start varchar(50),
 7 @time_end varchar(50),
 8 @id int,
 9 @takeoutid int,
10 @payment int
11 as 
12 begin
13 begin tran--开启事务
14 declare @errorSum int--定义一个变量存储错误代号
15 set @errorSum=0--初始值为0
16 
17 declare @tempCount int
18 select @tempCount=count(*) from takeout_setting where brand_id=@takeoutid
19 --判断有没有数据,有修改,没有增加
20 if(@tempCount=0)--如果表中没有数据,就新增数据
21 begin 
22 insert into takeout_setting(money_limit,fee,free_money,area,time_start,time_end,id,payment)
23 values(@money_limit,@fee,@free_money,@area,@time_start,@time_end,@id,@payment)
24 set @errorSum=@errorSum+@@ERROR
25 end
26 else--如果表中有数据,就修改数据
27 begin
28 update takeout_setting
29 set money_limit=@money_limit,
30 fee=@fee,
31 free_money=@free_money,
32 area=@area,
33 time_start=@time_start,
34 time_end=@time_end,
35 id=@id,
36 payment=@payment
37 where brand_id=@takeoutid
38 set @errorSum=@errorSum+@@ERROR
39 end
40 if @errorSum<>0
41 begin
42 rollback tran
43 return 0
44 end
45 else
46 begin
47 commit tran
48 return 1
49 end
50 end
51 -----------------------------------
52 begin tran
53 declare @errorSum int
54 set @errorSum=0
55 declare @a int
56 set @a=1
57 declare @b int
58 set @b=3
59 declare @c int
60 set @c=100
61 set @c=@b/@a
62 set @errorSum=@errorSum+@@ERROR
63 if(@errorSum<>0)
64 begin
65 rollback tran
66 end
67 else
68 begin 
69 commit tran
70 end
71 print @c
72 print @errorSum

 

posted @ 2014-11-13 14:20  猴儿de世界  阅读(369)  评论(0编辑  收藏  举报