一个sql server存储过程练习
因为有需要所以学习sql server存储过程,贴一个觉得还能实现功能的存储过程
1.建表
为了演示,所以写的简单点
creata table users (id int , name nvarchar(10) ) create table choose (id int, userdId int, subjectId int ) create table subject (id int, name nvarchar(20) )
说明:users 表保存学生名字,choose 表保存学生选课信息,subject表保存课程名字
一个学生可以有多门课程,一门课程可以有多个学生
2.提出问题
编写存储过程打印出如下要求的数据
学生编号 学生命名 所选课程
1 张三 数据库,大学英语,c语言
2 李四 大学英语,c语言
3.解决问题
插入些测试数据,不简述了
具体存储过程
USE [User] GO /****** Object: StoredProcedure [dbo].[NameAndSubject] Script Date: 11/20/2012 16:39:13 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= CREATE PROCEDURE [dbo].[NameAndSubject] -- Add the parameters for the stored procedure here AS declare @row int declare @users_id int,@users_name nvarchar(10) declare @subject_name nvarchar(20),@subject_rel nvarchar(100) declare cur cursor for select row_number()over(order by U.id) as RowNumber,U.id,U.name,S.name from users U,subject S,choose C where U.id = C.usersId and S.id = C.subjectId declare @id int,@name nvarchar(10) BEGIN SET NOCOUNT ON; print '编号 名字 课程' open cur --打开游标 fetch next from cur into @row,@users_id,@users_name,@subject_name --把结果赋值给变量 while @@FETCH_STATUS=0 --循环,且游标返回状态为0 begin --所有的操作都要包在begin end里面,不然要出错 if(@row = 1) --如果是第一行数据 begin --操作都要包含在begin end里 set @id = @users_id set @name = @users_name set @subject_rel = @subject_name end else if (@name = @users_name) --名字一样 begin set @subject_rel = @subject_rel + ',' +@subject_name --把课程名字追加在一起 end else begin print str(@id) + ' ' + @name + ' ' + @subject_rel --打印出结果 set @id = @users_id --赋值新的变量 set @name = @users_name set @subject_rel = @subject_name end fetch next from cur into @row,@users_id,@users_name,@subject_name --这里我觉得是最关键的,在while循环的末尾还要加上fetch语句,
--不然是死循环,我纠结了好久,还是老师提醒!网页上好多都不靠谱,都没提过 end print str(@id) + ' ' + @name + ' ' + @subject_rel --打印最后一组数据 END close cur --关闭游标 deallocate cur --释放游标
执行存储过程:
USE [User] GO EXEC [dbo].[NameAndSubject] GO
结果:
这里有个问题是,这个前面的空格是怎么产生的我也没弄懂!求大神指点
该过程的思路是:
1)先写出查询语句,检索出这样的结果,游标后面有
2)游标依次读出数据
如果RowNumber为1,既是第一行,就把数据保存起来
如果RowNumber不为1,且上一个学生名字和当前名字相同,就追加课程名
如果RowNumber不为1,且上一个学生名字和当前名字不相同,就打印出结果,并且把名字和课程结果设置为当前结果
退出游标后,打印最后一个记录
3)存储过程和游标使用注意事项
见代码注释
后记:
其实写完了也算是自己回顾了一下,没事多写写,多思考,多看资料
还有一年就出去了。但是还是学校好啊!