灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3200回复:0

[SQL Server]SQL Server开发存储过程

楼主#
更多 发布于:2013-06-17 11:05
SQL Server开发存储过程
 
存储过程是存储在存储过程名下的批处理,可被预编译。是服务器端代码。
 
具有如下优点:
 
1、存储过程是经过编译的,是执行查询和批处理的最快方式
 
2、在服务器端而不是桌面计算机上执行
 
3、存储过程是模块化的,提供了部署功能和修改代码简易途径
 
4、存储过程在数据库安全方面扮演了重要角色,可禁止用户直接访问表
 
一、管理存储过程
 
使用Create Alter Drop 来对存储过程进行创建、修改、删除
 
1、创建
 
格式:
 
Create Procedure 过程名(参数列表)
 
[with eccryption]
 
as
 
begin
 
..
 
return ..
 
end
 
2、修改
 
格式:除了关键字Create不一样,其他全一样。
 
注:如果要修改存储过程,使用Alter命令将优于删除存储过程,再重新创建存储过程,
 
因为后者在删除时,也删除了所有的权限设置。
 
3、删除
 
drop procdure 过程名
 
二、存储过程的编译
 
自动运行的,在首次执行时被编译并保存到内存中,当然也可以手工指定,
 
下次执行时重新编译。
 
exec sp_recompile 过程名
 
三、加密存储过程
 
通过在as 前加上with encryption
 
可用下面方法测试:sp_helptext 过程名
 
注:以sp_打头的一般都是系统存储过程。
 
四、向存储过程传递数据
 
存储过程可接受很多输入和输出参数
 
1、输入参数
 
通过在参数列表中添加参数实现,每个参数以@开头,并成为存储过程中的局部变量。
 
如:@name varchar(20)=‘XXM’
 
调用存储过程时,必须提供参数的值(除非有默认值,上面的参数就有默认值‘XXM’)
 
如:
 
[sql]
create procedure selectyuangong(@name varchar(20),@age int)  
  
with encryption  
  
as  
  
begin  
  
select * from yuangong where truename=@name and age=@age  
  
end  
调用:
 
exec selectyuangong @name=’XXM’,@age=20
 

 
exec selectyuangong ’XXM’,20
 

 
exec selectyuangong ’XXM’,@age=20
 
3种方式(但顺序需要与形参一致)
 
四、从存储过程中返回数据
 
SQL Server提供了4种从存储过程返回数据的方法,
 
1、通过select语句 2、通过raiserror
 
3、输出参数        4、通过return命令
 
1、输出参数
 
在参数列表中加入:@名称 类型 output
 
如:@name varchar(20) output
 
无论是创建存储过程还是调用存储过程时,都必须使用关键字output,在调用存储过程
 
的程序或批处理中,必须创建一个变量来接受输出参数的值。
 
注:虽然输出参数通常只用于从存储过程中返回值,但它们实际上是双向参数
 
(也就是说可以通过它向存储过程内部传递参数)
 
如:
 
[sql]
alter procedure selectyuangong(@name varchar(20),@age int output)  
  
with encryption  
  
as  
  
begin  
  
select @age=YEAR(GETDATE())-YEAR(birthday) from yuangong where truename=@name  
  
end  
  
go  
  
declare @bck_age int  
  
set @bck_age=-1  
  
exec selectyuangong '小三',@bck_age output  
  
print @bck_age  
 
 
2、使用Return命令
 
如:
 
[sql]
alter procedure selectyuangong(@name varchar(20),@age int output)  
  
with encryption  
  
as  
  
begin  
  
declare @count int  
  
select @count =count(*),@age=YEAR(GETDATE())-YEAR(birthday) from yuangong where truename=@name  group by birthday  
  
if(@count>0)  
  
return 1  
  
else  
  
return 0  
  
end  
  
go  
  
declare @bck_age int,@bck_count int  
  
set @bck_age=-1  
  
exec @bck_count=selectyuangong '小三',@bck_age output  
  
print @bck_age  
  
print @bck_count  
 
 
注:一般使用返回值来指出运行成功还是失败,而不要使用它来返回实际数据
 
五、返回数据的途径及其适用范围
 
1、return与output都将数据返回给SQL Server中直接调用存储过程的程序
 
或批处理
 
2、raiserror和select语句将数据直接返回给最终用户的客户端应用程序
 
注:对于每个返回的记录集,SQL Server在默认情况下,都将发送一条消息
 
,指出影响的行,但是影响性能,所以一般在存储过程开头加上
 
:set nocount on
 
如:
 
[sql]
alter procedure selectyuangong(@name varchar(20),@age int output)  
  
with encryption  
  
as  
  
begin  
  
set nocount on  
  
declare @count int  
  
select @count =count(*),@age=YEAR(GETDATE())-YEAR(birthday) from yuangong where truename=@name  group by birthday  
  
if(@count>0)  
  
return 1  
  
else  
  
return 0  
  
end  
 
六、查询中使用存储过程
 
1、使用openquery()来调用存储过程--这属于分布式调用,也就是不同服务器之间
 
如:
 
Select * from OpenQuery(XXM-PC,’exec  selectyuangong @name=’XXM’’)
 
这句代码的意思是调用服务器XXM-PC执行selectyuangong存储过程,一般由远程
 
服务器实现。
 
2、在本地执行远程服务器的存储过程
 
exec 服务器名.数据库名.对象名.过程名  参数赋值

喜欢0 评分0
游客

返回顶部