SQL Server:设置变量用例

时间:2018-12-07 13:02:33

标签: sql sql-server

我有一个类似的脚本:

DECLARE @OrderStatusIds VARCHAR(50);

SET @OrderStatusIds =
    (SELECT OrderStatusId FROM OrderStatus WHERE OrderStatusDescription = 
        CASE
            WHEN @OrderStatus  = 'Open' THEN 'Open'
            WHEN @OrderStatus  = 'Cancelled' THEN 'Cancelled'
            ELSE OrderStatusDescription -- get all order statuses
        END
    );

SELECT O.OrderNo, OS.OrderStatusDescription
FROM OrderHeader O
INNER JOIN OrderStatus OS ON O.OrderStatusId = OS.OrderStatusId
WHERE OH.OrderStatusId IN @OrderStatusIds

但是我得到一个错误

  

子查询返回了多个值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

我想获取项目列表并将其存储在该变量中。

谢谢。

1 个答案:

答案 0 :(得分:1)

您将使用表变量存储订单ID的列表

DECLARE @OrderIds TABLE (OrderId VARCHAR(50));

INSERT INTO @OrderIds (OrderId)
    SELECT OrderId
    FROM Order
    WHERE ((OrderDescription = @OrderStatus) OR
           @OrderStatus NOT IN ('Open', 'Cancelled')
          );

请注意,这将CASE替换为更简单的布尔逻辑。通常,您希望避免在CASE子句中使用WHERE,因为它们使优化程序更难以优化查询。