• SQL Server存储过程作业(三)


    阶段4:练习——插入入住客人记录
    需求说明
    使用存储过程将入住客人信息插入客人信息表中,要求:
    检查身份证号必须是18个字符组成
    押金的默认值为1000元
    如果客人记录插入成功,输出客人流水号;否则输出出错信息
    提示:
    客人的信息作为存储过程的输入参数
    客人流水号作为存储过程的输出参数
    利用事务确保数据完整性
    客人记录插入客人信息表
    修改客人入住房间的人数
    --阶段4:添加一个入住客人的信息
    IF EXISTS(SELECT * FROM sysobjects WHERE name='usp_insertGuestRecord')
      DROP PROC usp_insertGuestRecord
    GO
    CREATE procedure usp_insertGuestRecord
        @GuestID int OUTPUT,                ---客户流水号
        @identityID varchar(50),            ---身份证号
        @guestName nchar(20),                ---客户姓名
        @roomID int,                        ---房间号
        @ResideDate datetime,                ---入住时间
        @deposit decimal(18,2) = 1000        ---押金
    
    AS
        SET @GuestID = -1
        IF (@identityID IS NULL OR LEN(@identityID) <> 18)
            return -1
    
        BEGIN TRANSACTION
        INSERT INTO GuestRecord
        (
            IdentityID,
            GuestName,
            RoomID,
            ResideID,
            ResideDate,
            Deposit)
        VALUES
        (
            @identityID,
            @guestName,
            @roomID,
            1,
            @ResideDate,
            @deposit
        )
        IF (@@ERROR <> 0)
        BEGIN
            ROLLBACK TRANSACTION
            return 'false'
        END
    
        DECLARE @RoomStateID int
        SELECT @RoomStateID=RoomStateID FROM RoomState
        WHERE RoomStateName = '已入住'
        ---客房状态变为“入住”,客人数量增1
        Update Room set RoomStateID =@RoomStateID,GuestNum=GuestNum+1
         WHERE RoomID = @roomID
        IF (@@ERROR <> 0)
        BEGIN
            ROLLBACK TRANSACTION
            return -1
        END
        COMMIT TRANSACTION
        SET @GuestID=@@IDENTITY
        return 0
    GO
    
    --调用存储过程
    DECLARE @identityID varchar(50)            ---身份证号
    DECLARE @guestName nchar(20)            ---客户姓名
    DECLARE @roomID int                        ---房间号
    DECLARE @deposit decimal(18,2)            ---押金
    DECLARE @ResideDate datetime            ---入住时间
    DECLARE @Result varchar(20)
    DECLARE @GuestID int
    
    SET @identityID = '11010119950506112x'
    SET @guestName = '风无痕'
    SET @roomID = 1008
    SET @deposit = 1000
    SET @ResideDate = GETDATE()
    
    EXEC @Result = usp_insertGuestRecord @GuestID OUTPUT,@identityID,@guestName,
                                         @roomID,@ResideDate,@deposit 
    IF (@Result = 0)
    BEGIN
      PRINT '插入客人记录操作成功' 
      PRINT '客人编号是' + CAST(@GuestID AS varchar)
    END
    ELSE
      PRINT '插入客人记录操作失败' 
    阶段5:练习——使用视图查询正在维修的房间信息
    创建视图查询维修房间的信息,要求:
    要有房间号,房间名称,房间状态
    提示:
    连接房间客房信息表
    客房状态表
    客房类型表查询
     
    --查询在维修状态的房间信息
    create view  RoomStateName
    as
        select Room.RoomID,RoomType.TypeName,
        RoomState.RoomStateName 
        from Room
        inner  join RoomType on RoomType.TypeID=Room.RoomTypeID
        inner join RoomState on RoomState.RoomStateID=Room.RoomStateID
        where RoomState.RoomStateName='维修'
    go
    
    select * from RoomStateName
    阶段6:练习——使用事物将已经退房的客户信息删除:
    提示:
    首先将已经退房的客户信息放到历史表里面(historyGuest)
    在将客人信息表里面的数据删除(GuestRecord)
    判断客人是否退房可以判断离开时间是否为空,不为空即是退房
     
     
    --使用事物删除room表里面已经退房的旅客
    begin transaction 
    declare @errorNum  int --错误的号码
    set @errorNum=0
    select *  into historyGuest from  GuestRecord
    where LeaveDate is not null
    set @errorNum=@errorNum+@@ERROR
    delete  from  GuestRecord
    where LeaveDate is not null
    set @errorNum=@errorNum+@@ERROR
    if(@errorNum<>0)
    begin
    print '删除失败,事物回滚'
    rollback transaction
    end
    else
    begin
    print '删除成功'
    commit transaction
    end
  • 相关阅读:
    洛谷 P1231 教辅的组成
    BZOJ 2190: [SDOI2008]仪仗队
    Codeforces GYM 100741A . Queries
    COGS 1298. 通讯问题
    洛谷 P2604 [ZJOI2010]网络扩容
    codevs 1227 方格取数 2
    codevs 1004 四子连棋
    洛谷 P2319 [HNOI2006]超级英雄
    洛谷 P2153 [SDOI2009]晨跑
    插入排序
  • 原文地址:https://www.cnblogs.com/wlx520/p/4501970.html
Copyright © 2020-2023  润新知