文档详情

存储过程及游标.doc

发布:2017-03-10约1.04万字共20页下载文档
文本预览下载声明
存储过程、游标 上午 存储过程 一、遇到的问题 我们在之前学习的课程写了不少的批处理语句,这些批处理语句存在两个问题: 没法像函数那样传参数运行(自定义化) 没法像函数那样可以反复地调用(功能化模块化) 说到这里,我们可以猜到,数据库中应该可以建立函数形式的数据库对象来解决这样的问题。但是介绍这种数据库对象之前,我们再来看几个需要解决的问题: 我们已经学会把一条select语句封装在视图中,但是它只能用来查询,如果我们希望进行其它操作,比如增删改记录、建删库表等,是不能用视图来完成的。 另一方面,如果把一个带有更改操作的批处理整个存储成数据库对象,还可以把处理数据的程序移动到离数据尽可能近的地方,而不是总把这些操作写在客户端程序(如Java、C#)中。通过将处理数据的程序从客户应用程序移动到服务器,可以降低网络流量,并提高性能和数据的完整性。 二、存储过程的概念 解决上面的问题,我们可以使用一种叫做“存储过程”的数据库对象。 存储过程(Stored Procedure)把我们的复杂sql语句保存数据库。之前视图是保存在服务器上的命名语句,与之类似,存储过程是保存在服务器上的命名批处理,系统将预先对它进行编译。T-SQL语句,如数据存取语句、流程控制语句、错误处理语句等,使用起来弹性很大 system stored procedure 前缀sp_sp_help sp、helpdb 扩展存储过程 extended stored procedure 前缀xp_xp_cmdshell 用户自定义存储过程 user-defined stored procedure 也就是我们自己创建的 三、用户自定义存储过程的创建、修改、删除 【创建create proc 存储过程名 --无参数的存储过程 as 批处理语句 go修改as 批处理语句 go删除--插入一个以时间为用户名的用户 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,新用户) commitgo 然后使用exec执行这个存储过程: exec insUser 选中exec这一行,然后按F5快速地反复执行,你会发现在同一秒内只能插入一个用户。 这个存储过程一旦建立就不能再次执行这段代码了,可以把create改成alter来修改。 注意存储过程的代码中不能go语句,因为go是用来提交批的,一旦遇到go系统会认为这个存储过程的代码已经书写完毕,会提交create或者alter的批处理。如果希望在存储过程中执行另一个批处理,请把该批处理写成另一个存储过程并调用。 四、用户自定义存储过程的参数传递和返回值 【传递参数】 create|alter proc 存储过程名 @参数名 参数类型[, @参数名 参数类型...] as 批处理语句 godeclare @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 存储过程不使
显示全部
相似文档