游标嵌套

本文介绍了一个宿舍管理系统的数据库设计,包括楼栋、楼层、房间及学员住宿等表的创建脚本,并提供了一个存储过程来查询特定楼层的空房间及空床位列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前台结果包括以下几个表:

楼栋表;楼层表;房间表;学员住宿表

脚本如下:

--楼栋表

CREATE TABLE [dbo].[CellInfo] (
 [CellCode] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,--楼栋编号(如:A栋、B栋)
 [FloorNum] [int] NULL ,--楼层数
 [DormManager] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,--该楼栋的管理员
 [DormClass] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,--该楼栋的班级类别(男生、女生宿舍或男女混住)
) ON [PRIMARY]
GO

--楼层表
CREATE TABLE [dbo].[FloorInfo] (
 [FloorId] [int] IDENTITY (1, 1) NOT NULL ,
 [CellCode] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,--对应的楼栋
 [FloorCode] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,--楼层
 [DormNum] [int] NULL ,--房间的数量
 [FloorType] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,--该楼栋层的班级类别(男生或女生宿舍)
 [GUID] [nvarchar] (48) COLLATE Chinese_PRC_CI_AS NULL --标识列
) ON [PRIMARY]
GO

--房间表
CREATE TABLE [dbo].[DormInfo] (
 [DormId] [int] IDENTITY (1, 1) NOT NULL ,
 [GUID] [nvarchar] (48) COLLATE Chinese_PRC_CI_AS NULL ,--对应楼层的GUID
 [DormCode] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,--寝室号
 [DormMaster] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,--寝室长
 [BedNum] [int] NULL ,--床位数量
 [DormTel] [nvarchar] (13) COLLATE Chinese_PRC_CI_AS NULL ,--电话
 ) ON [PRIMARY]
GO

--学员住宿表
CREATE TABLE [dbo].[DormStudentInfo] (
 [GUID] [nvarchar] (48) COLLATE Chinese_PRC_CI_AS NOT NULL ,--对应楼层的GUID
 [DormCode] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,--寝室号
 [StudentId] [nvarchar] (16) COLLATE Chinese_PRC_CI_AS NULL , --学员
 [BedCode] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL --床位
) ON [PRIMARY]
GO


--利用这几个表,给出GUID(对应某一楼栋的某一楼层),列出相应楼层的空房间(全空)以及空房间(半空)的空床位列表:

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

create  proc SP_Select_FloorEmptyList
@GUID nvarchar(48)
as
select * into #temp from dbo.DormInfo where GUID = @GUID

select DormCode,BedNum into #temp1 from #temp where DormCode not in
(select DormCode from dbo.DormStudentInfo)

--空房间列表
select * from #temp1

select DormCode,BedNum,SN = BedNum -
(select count(*) from dbo.DormStudentInfo where DormStudentInfo.DormCode = #temp.DormCode),
DormTel into #temp2 from #temp where BedNum >
(select count(*) from dbo.DormStudentInfo where DormStudentInfo.DormCode = #temp.DormCode)
and DormCode not in (select DormCode from #temp1)

--update #temp2
--set DormTel = '81945842'
--where DormCode = 'B505'

--select * from #temp2

 

DECLARE EDcursor CURSOR FOR 
SELECT DormCode,BedNum 
FROM #temp2
--ORDER BY au_fname, au_lname
declare @DormCode nvarchar(8),@BedNum int,@ENumS nvarchar(13),@ENum nvarchar(10)
--set @ENumS = ''
OPEN EDcursor
FETCH NEXT FROM EDcursor into @DormCode,@BedNum
WHILE @@FETCH_STATUS = 0
BEGIN
  set @ENumS = ''
  DECLARE ENcursor CURSOR FOR select * from dbo.OrderNum where orderNum <= @BedNum and orderNum not in
  (select BedCode from dbo.DormStudentInfo where DormCode = @DormCode) 
  open ENcursor
  FETCH NEXT FROM ENcursor into @ENum
  WHILE @@FETCH_STATUS = 0
  BEGIN
  --select @ENum = 
  if @ENumS = ''
  set @ENumS = @ENum
  else
  set @ENumS = @ENumS + ',' + @ENum
  FETCH NEXT FROM ENcursor into @ENum 
  END
   
  update #temp2
  set DormTel = @ENumS
  where DormCode = @DormCode
  CLOSE ENcursor
  DEALLOCATE ENcursor

   
  --DECLARE ENcursor CURSOR FOR select
  FETCH NEXT FROM EDcursor into @DormCode,@BedNum 
END

CLOSE EDcursor
DEALLOCATE EDcursor


--空床位列表
select * from #temp2
drop table #temp,#temp1,#temp2

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值