没有合适的资源?快使用搜索试试~ 我知道了~
首页TSQL 存储过程 游标 数据库 sql优化 存储过程分页
TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页
资源详情
资源评论
资源推荐
存储过程、游标
上午
存储过程
一、遇到的问题
我们在之前学习的课程写了不少的批处理语句,这些批处理语句存在两个问题:
没法像函数那样传参数运行(自定义化)
没法像函数那样可以反复地调用(功能化模块化)
说到这里,我们可以猜到,数据库中应该可以建立函数形式的数据库对象来解决这样
的问题。但是介绍这种数据库对象之前,我们再来看几个需要解决的问题:
我们已经学会把一条 语句封装在视图中,但是它只能用来查询,如果我们希望
进行其它操作,比如增删改记录、建删库表等,是不能用视图来完成的。
另一方面,如果把一个带有更改操作的批处理整个存储成数据库对象,还可以把处理
数据的程序移动到离数据尽可能近的地方,而不是总把这些操作写在客户端程序(如
、)中。通过将处理数据的程序从客户应用程序移动到服务器,可以降低网络流
量,并提高性能和数据的完整性。
二、存储过程的概念
解决上面的问题,我们可以使用一种叫做“存储过程”的数据库对象。
存储过程(Stored Procedure)把我们经常用到的一串复杂 语句保存成一个数
据库对象,并给它起一个名字。每次使用存储过程只需要使用如下的形式即可:
exec proc 存储过程名
存储过程还可以带参数运行:
exec proc 存储过程名 参数值[, 参数值...]
存储过程并不神秘,它就是批处理。之前提到视图是保存在服务器上的命名 语
句,与之类似,存储过程是保存在服务器上的命名批处理,系统将预先对它进行编译。
存储过程可以包含几乎所有的 语句,如数据存取语句、流程控制语句、错误处
理语句等,使用起来弹性很大。
数据库中也存在着系统函数和用户定义函数这两种对象,用户定义函数的功能和存储
过程很像,但是有一定的区别,我们将在后面的课程中介绍。
【存储过程的分类】
系统存储过程 前缀 例如 、
扩展存储过程 !"前缀 !例如 !
用户自定义存储过程 #"也就是我们自己创建的
三、用户自定义存储过程的创建、修改、删除
【创建存储过程】
create proc 存储过程名 --无参数的存储过程
as
批处理语句
go
【修改存储过程】
alter proc 存储过程名 --无参数的存储过程
as
批处理语句
go
可以看到,修改存储过程的语法和创建的语法只差一个单词,把 换成 即可。
【删除存储过程】
drop proc 存储过程名
我们还可使用 "$"% 来管理存储过程,展开菜单树中的“可编程性”,
在“存储过程”的子节点中可以进行各种操作。这里要说一下创建:当点击“新建存储过程”之
后,会出现一个基于模板的创建语句。这时点击菜单中的“查询 →指定模板参数的值”,即
可弹出对话框来对模板进行设置,从而建立我们想要的存储过程。另外,点击菜单中的“视
图→模板资源管理器”,可以看到 &'(&'))* 为我们提供的各种 语句模板。
模板的功能比较高级,有兴趣的同学务必自学一下。
【一个简单的例子】
--插入一个以时间为用户名的用户
create proc insUser
as
begin tran
declare @username varchar(20)
set @username=convert(varchar(8),getdate(),112)
+replace(convert(varchar(10),getdate(),8),':','')
if not exists(select * from yonghu where yonghuming=@username)
insert into yonghu values
(@username,'111111','@163.com','新用户')
commit tran --也可以写 commit,但是建议不要去掉 tran
go
然后使用 ! 执行这个存储过程:
exec insUser
选中 ! 这一行,然后按 +* 快速地反复执行,你会发现在同一秒内只能插入一个用户。
这个存储过程一旦建立就不能再次执行这段代码了,可以把 改成 来修改。
注意存储过程的代码中不能 $ 语句,因为 $ 是用来提交批的,一旦遇到 $ 系统会
认为这个存储过程的代码已经书写完毕,会提交 或者 的批处理。如果希望在
存储过程中执行另一个批处理,请把该批处理写成另一个存储过程并调用。
四、用户自定义存储过程的参数传递和返回值
【传递参数】
create|alter proc 存储过程名
@参数名 参数类型[,
@参数名 参数类型...]
as
批处理语句
go
还记得我们前面做过的一个案例吗:
declare @tablename nvarchar(10),@id varchar(10),@idvalue int
declare @sql varchar(100)
set @tablename='yiren'
set @id='yirenid'
set @idvalue=10
set @sql='select * from '+@tablename+' where '+@id+' =
'+cast(@idvalue as varchar)
print @sql
exec(@sql)
现在我们把它写成存储过程。这样我们每次都可以从一个指定表中提取我们想要的记录了
create proc queryItem
@tablename nvarchar(10),
@id varchar(20),
@idvalue int --参数外面还可以套上圆括号,看起来更加清晰
as
declare @sql varchar(100)
set @sql='select * from '+@tablename+'
where '+@id+' = '+cast(@idvalue as varchar)
exec(@sql)
go
调用的方法:
exec queryItem 'yiren','yirenid',@idvalue=10
queryItem 'jingjiren','jingjirenid',1
存储过程不使用 ! 也可以调用,但是不推荐这么做。存储过程参数的名字可以在
调用时写出来,但是这是完全没必要的,所以,%-) 直接写成 ) 就可以了。
exec 加不加括号效果不一样。加括号是执行 sql 语句,不加括号是执行存储过程。
【返回值】
1. 以 retrun 返回,始终是整数值
" 只能返回整数,即使不显式写出“"整数值”这样的语句,存储过程也会自
动返回一个数值 ) 表示成功。我们可以在发生错误时返回非 ) 值,表示有错误发生。不要
试图使用 " 返回一个在存储过程中处理的结果,比如姓名、生日之类的内容,因为它
是整数,功能极为有限。我们只用它返回存储过程执行的状态就足够了。请看例子:
create proc returnProc
as
begin tran
declare @error int
insert into yiren (xingming) values ('王美丽')
set @error=@@error
insert into yiren (yirenid) values (1)
set @error=@error+@@error
if @error>0
rollback tran
else
commit tran
return @error
go
调用的方法:
declare @error int
--set @error=exec returnProc --这样写是错误的……
剩余15页未读,继续阅读
yet8telecom
- 粉丝: 1
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- ExcelVBA中的Range和Cells用法说明.pdf
- 基于单片机的电梯控制模型设计.doc
- 主成分分析和因子分析.pptx
- 共享笔记服务系统论文.doc
- 基于数据治理体系的数据中台实践分享.pptx
- 变压器的铭牌和额定值.pptx
- 计算机网络课程设计报告--用winsock设计Ping应用程序.doc
- 高电压技术课件:第03章 液体和固体介质的电气特性.pdf
- Oracle商务智能精华介绍.pptx
- 基于单片机的输液滴速控制系统设计文档.doc
- dw考试题 5套.pdf
- 学生档案管理系统详细设计说明书.doc
- 操作系统PPT课件.pptx
- 智慧路边停车管理系统方案.pptx
- 【企业内控系列】企业内部控制之人力资源管理控制(17页).doc
- 温度传感器分类与特点.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论2