包括以下几个表:
楼栋表;楼层表;房间表;学员住宿表
脚本如下:
--楼栋表
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