SQL-Server实例需求帮助 学校宿舍分配问题

ANVTT^^ 2017-08-11 09:30:30
现我自建了一个学校宿舍管理数据库 现在问题是 我需要将一个班级的男女生分别分配到宿舍中,最大人数6人 满了6人自动转到下一个宿舍中 其中当一个宿舍满了6人时 就循环判断一次 然后继续分配 。
现在的问题是 我自己写出的代码 不能完整执行 ,只有输入了21个数据 (总有32个学生数据)

代码如下:Stu_No-学生编号 DorNo-宿舍楼编号 RNo-宿舍编号 id-表Classroom主键
USE [StudDbDate]
GO
/****** Object: StoredProcedure [dbo].[stu_room] Script Date: 08/10/2017 14:22:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[stu_room]
AS
DECLARE @Stu_No NVARCHAR(20)
DECLARE @DorNo NVARCHAR(20)
DECLARE @RNo NVARCHAR(20)
DECLARE @id INT
DECLARE @i INT
SET @i = 1
SET @DorNo = 1
SET @RNo = '001'
DECLARE rs CURSOR LOCAL SCROLL FOR
SELECT Stu_No FROM dbo.Base_Student
OPEN rs
FETCH NEXT FROM rs INTO @Stu_No
WHILE ( @@FETCH_STATUS = 0 )
BEGIN
IF ( SELECT Stu_sex FROM Base_Student WHERE Stu_No = @Stu_No ) = '男'
BEGIN
IF ( SELECT COUNT(*) FROM dbo.Relation_Classroom WHERE RNo = @RNo AND DorNo=@DorNo ) < 6
BEGIN
INSERT dbo.Relation_Classroom ( id, Stu_No, DorNo, RNo ) VALUES ( @i, @Stu_No, @DorNo, @RNo )
SET @i = @i + 1
END
ELSE
BEGIN
SET @RNo=CAST (@RNO AS int)+1; SET @RNo='00'+CAST (@RNo AS NVARCHAR(20));
----缺少条件
----缺少条件
END
END
ELSE
BEGIN
SET @DorNo=2;
IF ( SELECT COUNT(*) FROM dbo.Relation_Classroom WHERE RNo = @RNo AND DorNo=@DorNo) < 6
BEGIN
INSERT dbo.Relation_Classroom ( id, Stu_No, DorNo, RNo ) VALUES ( @i, @Stu_No, @DorNo, @RNo )
SET @i = @i + 1
END
ELSE
BEGIN
SET @RNo=CAST (@RNO AS int)+1; SET @RNo='00'+CAST (@RNo AS NVARCHAR(20));
END
END
FETCH NEXT FROM rs INTO @Stu_No
END
CLOSE rs
DEALLOCATE rs
...全文
626 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2017-08-11
  • 打赏
  • 举报
回复
引用 12 楼 qq_33314727 的回复:
好的好的 第一次提问 给你带了不便 不好意思 我好好去看看
额,也不是给我带来不便……就是描述的清楚点,可能大家回答的会更准确,方便快速的解决问题
ANVTT^^ 2017-08-11
  • 打赏
  • 举报
回复
引用 10 楼 sinat_28984567 的回复:
[quote=引用 8 楼 qq_33314727 的回复:] [quote=引用 5 楼 sinat_28984567 的回复:] [quote=引用 4 楼 qq_33314727 的回复:] 是的是的 我现在这个代码可能缺了好些东西 输出如图片中这样
试试2#的代码可以吗?[/quote]什么是2#的代码啊..?[/quote] 第二个回复帖子的代码…… 建议楼主列出表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382[/quote] 好的好的 第一次提问 给你带了不便 不好意思 我好好去看看
OwenZeng_DBA 2017-08-11
  • 打赏
  • 举报
回复
引用 9 楼 qq_33314727 的回复:
[quote=引用 7 楼 z10843087 的回复:] [quote=引用 4 楼 qq_33314727 的回复:] 是的是的 我现在这个代码可能缺了好些东西 输出如图片中这样
看到问题了,你@DorNo = 2 的时候,就是女生和男生用了相同的RNO,你单独定义一个@RNo2 给女生用就可以[/quote] 谢谢指点 你这么一说 我明白了不少 ,还有就是 我这个代码输出的结果只有这几个 也是因为我没有给女生单独定义一个新的RNO吗?[/quote] 恩,你先改了再跑下试试先
二月十六 2017-08-11
  • 打赏
  • 举报
回复
引用 8 楼 qq_33314727 的回复:
[quote=引用 5 楼 sinat_28984567 的回复:] [quote=引用 4 楼 qq_33314727 的回复:] 是的是的 我现在这个代码可能缺了好些东西 输出如图片中这样
试试2#的代码可以吗?[/quote]什么是2#的代码啊..?[/quote] 第二个回复帖子的代码…… 建议楼主列出表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
ANVTT^^ 2017-08-11
  • 打赏
  • 举报
回复
引用 7 楼 z10843087 的回复:
[quote=引用 4 楼 qq_33314727 的回复:] 是的是的 我现在这个代码可能缺了好些东西 输出如图片中这样
看到问题了,你@DorNo = 2 的时候,就是女生和男生用了相同的RNO,你单独定义一个@RNo2 给女生用就可以[/quote] 谢谢指点 你这么一说 我明白了不少 ,还有就是 我这个代码输出的结果只有这几个 也是因为我没有给女生单独定义一个新的RNO吗?
ANVTT^^ 2017-08-11
  • 打赏
  • 举报
回复
引用 5 楼 sinat_28984567 的回复:
[quote=引用 4 楼 qq_33314727 的回复:] 是的是的 我现在这个代码可能缺了好些东西 输出如图片中这样
试试2#的代码可以吗?[/quote]什么是2#的代码啊..?
OwenZeng_DBA 2017-08-11
  • 打赏
  • 举报
回复
引用 4 楼 qq_33314727 的回复:
是的是的 我现在这个代码可能缺了好些东西 输出如图片中这样
看到问题了,你@DorNo = 2 的时候,就是女生和男生用了相同的RNO,你单独定义一个@RNo2 给女生用就可以
ANVTT^^ 2017-08-11
  • 打赏
  • 举报
回复
回复ap0405140 : 就是 当这个宿舍输入了6个人以后 就进行一次判断 判断这个宿舍人满没(人满为6人) 判断后就跳到下一个宿舍继续输入了嘛 这个判断需要循环。我没说清楚 不好意思
二月十六 2017-08-11
  • 打赏
  • 举报
回复
引用 4 楼 qq_33314727 的回复:
是的是的 我现在这个代码可能缺了好些东西 输出如图片中这样
试试2#的代码可以吗?
ANVTT^^ 2017-08-11
  • 打赏
  • 举报
回复
是的是的 我现在这个代码可能缺了好些东西 输出如图片中这样
唐诗三百首 2017-08-11
  • 打赏
  • 举报
回复
"其中当一个宿舍满了6人时 就循环判断一次 然后继续分配 。" --> 不好意思, 没看明白.
二月十六 2017-08-11
  • 打赏
  • 举报
回复
/****** Object:  StoredProcedure [dbo].[stu_room]    Script Date: 08/10/2017 14:22:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[stu_room]
AS
    DECLARE @Stu_No NVARCHAR(20) 
    DECLARE @DorNo NVARCHAR(20)
    DECLARE @RNo NVARCHAR(20) 
    DECLARE @id INT
    DECLARE @i INT
    SET @i = 1
    SET @DorNo = 1
    SET @RNo = '001'
    DECLARE rs CURSOR LOCAL SCROLL
    FOR
        SELECT  Stu_No
        FROM    dbo.Base_Student
    OPEN rs
    FETCH NEXT FROM rs INTO @Stu_No
    WHILE ( @@FETCH_STATUS = 0 )
        BEGIN
            IF ( SELECT Stu_sex
                 FROM   Base_Student
                 WHERE  Stu_No = @Stu_No
               ) = '男'
                BEGIN
                    IF ( SELECT COUNT(*)
                         FROM   dbo.Relation_Classroom
                         WHERE  RNo = @RNo
                                AND DorNo = @DorNo
                       ) < 6
                        BEGIN 
                            INSERT  dbo.Relation_Classroom
                                    ( id, Stu_No, DorNo, RNo )
                            VALUES  ( @i, @Stu_No, @DorNo, @RNo )
                            SET @i = @i + 1
                        END
                    ELSE
                        BEGIN
                            SET @RNo = CAST(@RNO AS INT) + 1;
                            SET @RNo = '00' + CAST(@RNo AS NVARCHAR(20)); 
----缺少条件
----如果大于6了,就往下一个房间里插入数据
                            SET @i = 1
                            INSERT  dbo.Relation_Classroom
                                    ( id, Stu_No, DorNo, RNo )
                            VALUES  ( @i, @Stu_No, @DorNo, @RNo )
                            

----缺少条件
                        END
                END
            ELSE
                BEGIN
                    SET @DorNo = 2;
                    IF ( SELECT COUNT(*)
                         FROM   dbo.Relation_Classroom
                         WHERE  RNo = @RNo
                                AND DorNo = @DorNo
                       ) < 6
                        BEGIN 
                            INSERT  dbo.Relation_Classroom
                                    ( id, Stu_No, DorNo, RNo )
                            VALUES  ( @i, @Stu_No, @DorNo, @RNo )
                            SET @i = @i + 1
                        END
                    ELSE
                        BEGIN
                            SET @RNo = CAST(@RNO AS INT) + 1;
                            SET @RNo = '00' + CAST(@RNo AS NVARCHAR(20)); 

----如果大于6了,就往下一个房间里插入数据
                            SET @i = 1
                            INSERT  dbo.Relation_Classroom
                                    ( id, Stu_No, DorNo, RNo )
                            VALUES  ( @i, @Stu_No, @DorNo, @RNo )


                        END
                END
            FETCH NEXT FROM rs INTO @Stu_No
        END
    CLOSE rs
    DEALLOCATE rs
二月十六 2017-08-11
  • 打赏
  • 举报
回复
是不是这个意思?
/****** Object:  StoredProcedure [dbo].[stu_room]    Script Date: 08/10/2017 14:22:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[stu_room]
AS
    DECLARE @Stu_No NVARCHAR(20) 
    DECLARE @DorNo NVARCHAR(20)
    DECLARE @RNo NVARCHAR(20) 
    DECLARE @id INT
    DECLARE @i INT
    SET @i = 1
    SET @DorNo = 1
    SET @RNo = '001'
    DECLARE rs CURSOR LOCAL SCROLL
    FOR
        SELECT  Stu_No
        FROM    dbo.Base_Student
    OPEN rs
    FETCH NEXT FROM rs INTO @Stu_No
    WHILE ( @@FETCH_STATUS = 0 )
        BEGIN
            IF ( SELECT Stu_sex
                 FROM   Base_Student
                 WHERE  Stu_No = @Stu_No
               ) = '男'
                BEGIN
                    IF ( SELECT COUNT(*)
                         FROM   dbo.Relation_Classroom
                         WHERE  RNo = @RNo
                                AND DorNo = @DorNo
                       ) < 6
                        BEGIN 
                            INSERT  dbo.Relation_Classroom
                                    ( id, Stu_No, DorNo, RNo )
                            VALUES  ( @i, @Stu_No, @DorNo, @RNo )
                            SET @i = @i + 1
                        END
                    ELSE
                        BEGIN
                            SET @RNo = CAST(@RNO AS INT) + 1;
                            SET @RNo = '00' + CAST(@RNo AS NVARCHAR(20)); 
----缺少条件
----如果大于6了,就往下一个房间里插入数据
                            INSERT  dbo.Relation_Classroom
                                    ( id, Stu_No, DorNo, RNo )
                            VALUES  ( @i, @Stu_No, @DorNo, @RNo )
                            SET @i = @i + 1

----缺少条件
                        END
                END
            ELSE
                BEGIN
                    SET @DorNo = 2;
                    IF ( SELECT COUNT(*)
                         FROM   dbo.Relation_Classroom
                         WHERE  RNo = @RNo
                                AND DorNo = @DorNo
                       ) < 6
                        BEGIN 
                            INSERT  dbo.Relation_Classroom
                                    ( id, Stu_No, DorNo, RNo )
                            VALUES  ( @i, @Stu_No, @DorNo, @RNo )
                            SET @i = @i + 1
                        END
                    ELSE
                        BEGIN
                            SET @RNo = CAST(@RNO AS INT) + 1;
                            SET @RNo = '00' + CAST(@RNo AS NVARCHAR(20)); 

----如果大于6了,就往下一个房间里插入数据
                            INSERT  dbo.Relation_Classroom
                                    ( id, Stu_No, DorNo, RNo )
                            VALUES  ( @i, @Stu_No, @DorNo, @RNo )
                            SET @i = @i + 1

                        END
                END
            FETCH NEXT FROM rs INTO @Stu_No
        END
    CLOSE rs
    DEALLOCATE rs
OwenZeng_DBA 2017-08-11
  • 打赏
  • 举报
回复
引用 14 楼 qq_33314727 的回复:
[quote=引用 11 楼 z10843087 的回复:] [quote=引用 9 楼 qq_33314727 的回复:] [quote=引用 7 楼 z10843087 的回复:] [quote=引用 4 楼 qq_33314727 的回复:] 是的是的 我现在这个代码可能缺了好些东西 输出如图片中这样
看到问题了,你@DorNo = 2 的时候,就是女生和男生用了相同的RNO,你单独定义一个@RNo2 给女生用就可以[/quote] 谢谢指点 你这么一说 我明白了不少 ,还有就是 我这个代码输出的结果只有这几个 也是因为我没有给女生单独定义一个新的RNO吗?[/quote] 恩,你先改了再跑下试试先[/quote] 我现在跑了 我不是最大到第6个吗 我现在还有3条数据输入不了 就是第7个数据 不能输入 [/quote] 可以把对应的数据贴出来试试
ANVTT^^ 2017-08-11
  • 打赏
  • 举报
回复
引用 11 楼 z10843087 的回复:
[quote=引用 9 楼 qq_33314727 的回复:] [quote=引用 7 楼 z10843087 的回复:] [quote=引用 4 楼 qq_33314727 的回复:] 是的是的 我现在这个代码可能缺了好些东西 输出如图片中这样
看到问题了,你@DorNo = 2 的时候,就是女生和男生用了相同的RNO,你单独定义一个@RNo2 给女生用就可以[/quote] 谢谢指点 你这么一说 我明白了不少 ,还有就是 我这个代码输出的结果只有这几个 也是因为我没有给女生单独定义一个新的RNO吗?[/quote] 恩,你先改了再跑下试试先[/quote] 我现在跑了 我不是最大到第6个吗 我现在还有3条数据输入不了 就是第7个数据 不能输入
本课程根据讲师十多年在世界500强外企的生产环境中的SQL Serer数据库管理和项目实施经验倾心打造。课程系统性强,知识体系完整,覆盖90%以上的企业环境下SQL Server高可用场景,课程中不仅演示详细的操作步骤,更加突出最常见的故障和问题,让学员少走“弯路”,不只是让学员学会“操作”更能让学员“操作”的规范,满满的干货分享,一些课程资料(架构图、部署规划表格等)不仅可以帮助学员掌握技能,也可以作为学员在企业生产环境中实施SQL Server高可用的配置文档、操作手册等。课程的实验环境介绍:1)全部基于微软域环境和企业版SQL Server AOAG - 95%以上的企业环境都是在域环境中,不介绍非域环境和标准版的SQL Server高可用性组,这的配置在企业中较罕见,没有实践意义,不浪费学员时间。2)相应域环境已提前部署和配置好 - 学员导入虚拟机即可开始实验,无需从零开始搭建域环境,所有实验中SQL Server均已加域,直入主题,节省大量时间。3)最新的Windows Server故障转移集群(WS2016、WS2019)和最新版本的SQL Server(SQL2017、SQL2019) -  WS2016-SQL2017与WS2019-SQL2019是目前大多数企业SQL Server高可用的主要平台,基于微软产品生命周期现在一些企业也在讲早期的AOAG向这两个版本迁移,掌握这两种组合不仅让学员学会,更能学有所用。本课程为后续SQL Server进阶课程铺垫,是通向SQL Server DBA 专家的必经之路,讲师每周答疑两次。所有课程资料包括:课程PPT、架构图、部署规划表格、各类脚本学员均可下载。     
. 1 学生宿舍管理系统数据库设计说明书 1 引言 1.1编写目的 可以为编码人员、测试人员和维护人员提供关于后台数据库的专门指导,同 时也为本软件的使用者提供该数据库架构的详细情况、 数据输入输出的要求和规 格。 本数据库设计说明的预期读者为学校宿管科管理人员、楼栋管理员、客户、 中间用户(指软件开发的管理人员、开发人员、维护人员) 、最终用户。 1.2 背景 学生宿舍是学生学习、 生活的重要场所, 是学校精神文明的窗口和主要阵地, 它对学生的身心健康和世界观、人生观、价值观的形成起着重要的作用。随着高 等教育的发展,高校招生规模不断扩大,为了加强对学生宿舍的信息化管理,引 入现代化的管理手段和工具, 特开发学生宿舍管理系统对学生宿舍实行全方位的 管理。系统中存有学生多个方面的个人信息和入住情况信息,便于给学工部门和 物业管理部门及时提供学生的生活动态和住宿情况, 可有效提高宿舍管理的水平 和工作效率,降低管理成本。该系统软件非常容易被接受,可广泛应用于大中专 院校的房管部门,它具有简单易学性。 a.工程的名称: 《学生宿舍管理系统工程项目》 。 b.工程产品的名称: 《学生宿舍管理系统》 。 c.工程组织者:江西师范大学软件学院毕业设计工作指导小组。 d.产品用户:客户、学校宿管科管理人员、中间用户、最终用户。 e. 指导老师:曾雅琳。 f.产品设计者:江西师范大学软件学院黄艳艳、江淑娟、户文贵。 g.产品生产者:黄艳艳、江淑娟、户文贵。 1.3 参考资料 软件设计文档国家标准_GB8567-88 《学生宿舍管理系统需求说明书》 本系统开发小组编著 《软件工程导论》 第三版 清华大学出版社出版 张海藩编著 《SQL Server 2000教程》 北京希望电子出版社出版 龚波等编著 《Visual Basic 程序设计教程》 中国水利水电出版社 杨莉等编著 《Visual Basic 数据库系统开发实例导航》 人民邮电出版社 刘韬等编著 2 外部设计 2.1标识符和状态 本数据库名称为"dormitory",在"学生宿舍管理系统"完全测试完以前尚 属在实验中,本阶段的数据库数据文件的逻辑文件名为"dormitory_dat"、事务 日志文件的逻辑文件名为"dormitory_log",两个文件大小初始容量都为1MB, 当定义操作系统文件大小不够用时,可再增加。 2.2使用它的程序 使用本数据库的应用程序只有由江西师范大学软件学院开发的 《学生宿舍管 理系统 》第一版。 2.3约定 . 2 表命名约定:表名长度不能超过30个字符。 例如:学生信息表--student 字段命名约定:字段名尽量采用英文单词。 视图命名约定:采用规则View_表A_表B_表C,其中View表示"视图"。这个视 图由几个表产生就用连字符"_"连接几个表的名,如果表过多可以将表名适当简 化。 存储过程命名约定:P_表名_存取过程名(缩写),比如P_User_Deleted。 数据库、表、字段、索引、视图等一系列与数据库相关的名称必须全部使用 与内容相关的英文单词命名(尽量避免使用汉语拼音) ,对于一个单词难以表达 的,可以考虑用多个单词加下划线(_)连接(不能超过四个单词)命名。 2.4专门指导 输入本数据库的数据格式和标准请参照3.2的逻辑结构设计的数据类型和可 否为空。向本数据库添加、修改和更新数据有两种方式,一种是通过本数据库的 应用软件 《学生宿舍管理系统》 的输入界面进行, 另一种是通过 《SQL Server 2000》 数据库管理系统直接完成。 2.5支持软件 对本数据库的管理、生成、修改、更新都由《SQL Server 2000》数据库管 理系统完成, 本软件是微软公司最新版的大型数据库服务器, 具有数据可靠性强、 使用方便、功能强大、安全系数高的特性。 3 结构设计 3.1概念结构设计 图3-1 学生信息实体E-R图 图3-2 房间信息实体E-R图 房 间 栋 号 是否入住 寝 室 长 房间电话号码 空床位数量 房 间 号 所在学院 学 生 学生学号 学生姓名 性 别 联系电话 所在班级 家庭地址 . 3 图3-3 楼栋信息实体E-R图 图3-4 来访者实体E-R图 1 n m n 1 n n 1 图3-5 实体之间关系E-R图 各实体的属性分别为: 学生:{学生学号,学生姓名,性别, 所在学院,所在班级,家庭住址, 联系电话} 房间:{栋号,房间号,房间电话号码,寝室长,是否入住,空床位数量} 楼栋:{栋号,床位数量,是否有风扇,是否有电话,是否有电视机,是否有独 立卫生间,是否有热水器,住宿费,状态} 电费:{栋号,房间号,用电度数,电费} 来人来访:{日期,来访者姓名,性别,年龄,工作单位或证件号码,入楼时间, 访问原因及携带物

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧