sql - 在需要条件的上下文中指定的非 bool 类型表达式,位于 'Begin' 附近

标签 sql sql-server

我正在从事一个酒店项目,我需要检查房间的可用性。这里的逻辑是首先需要检查房间可用性,如果没有可用房间,那么我需要检查客户输入的结账日期是否等于任何客户的结账日期:

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/

相关文章:

sql-server - SQL Server 锁的问题

sql - SQL Server 中存在 WHERE EXISTS 的 JOIN ON LIKE 问题

php - SQL 添加不起作用

带有 "not exists"的 MySQL 查询花费的时间太长

sql - 在 PostgreSQL 中创建多个表

mysql - 根据外键的子字符串连接两个表(MS SQL 2005)

sql-server - 防止复制数据库文件

c# - 当数据库未启动但 SQL Server 已准备好连接时出现 SqlException

mysql - SQL查询以选择所有子文件夹

sql - 使用 unpivot 时如何解决列类型的差异?