我正在从事一个酒店项目,我需要检查房间的可用性。这里的逻辑是首先需要检查房间可用性,如果没有可用房间,那么我需要检查客户输入的结账日期是否等于任何客户的结账日期:
ALTER PROCEDURE [dbo].[customerdetails] (@CheckIn DATE, ...)
AS
BEGIN
BEGIN TRY
IF ( (SELECT Available
FROM rooms
WHERE roomtype = @RoomType) > 0 )
BEGIN
INSERT INTO Customerdetail
VALUES (@CheckIn, ...)
END
ELSE IF(SELECT *
FROM Customerdetail
WHERE RoomType = @RoomType
AND CheckOut = @CheckOut)
BEGIN
INSERT INTO Customerdetail
VALUES (@CheckIn, ...)
END
END TRY
BEGIN CATCH
DECLARE @ErrMessage NVARCHAR(max)
SET @ErrMessage=ERROR_MESSAGE()
RAISERROR (@ErrMessage,16,1)
END CATCH
END
但是我收到一个错误:
Msg 4145, Level 15, State 1
An expression of non-boolean type specified in a context where a condition is expected, near 'BEGIN'.
最佳答案
问题实际上就在这里,你只需说IF(获取结果)
:
ELSE IF(SELECT *
FROM Customerdetail
WHERE RoomType = @RoomType
AND CheckOut = @CheckOut)
我认为,这应该是IF(获取结果)=某些内容
或IF某些内容(关于结果)
,例如:
ELSE IF EXISTS (SELECT *
FROM Customerdetail
WHERE RoomType = @RoomType
AND CheckOut = @CheckOut)
保罗也认为该条款不合适,这是正确的:
IF ( (SELECT Available
FROM rooms
WHERE roomtype = @RoomType) > 0 )
如前所述,如果返回多行,则会产生:
Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
因此,您应该按照他的建议使用 EXISTS
进行编码。
您还应该确保在高并发级别下测试此解决方案,正如 Martin 在评论中建议的那样。
关于sql - 在需要条件的上下文中指定的非 bool 类型表达式,位于 'Begin' 附近,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18723054/