一个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)存储过程和游标使用注意事项

     见代码注释

 

后记:

其实写完了也算是自己回顾了一下,没事多写写,多思考,多看资料

还有一年就出去了。但是还是学校好啊!

posted @ 2012-11-21 22:35  lihuabest  阅读(575)  评论(0编辑  收藏  举报