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
...全文
624 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个数据 不能输入

27,579

社区成员

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

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