只有在使用带错误的参数时,case by case语句才会失败ORDER BY项必须出现在选择列表中

时间:2013-06-03 19:40:19

标签: sql-server parameters sql-order-by

我有一个存储过程,由工会加入的3个查询组成。这有效。它目前按价值设置顺序如下:

    ORDER BY [CategoryTypeID], [SortOrder], [Name]

我想让这个动态,所以我尝试使用这样的case语句:

    ORDER BY CASE WHEN @sort = 0 then [CategoryTypeID] ELSE [SortOrder] end

然而,当我这样做时,sql抱怨如果语句包含union ......等,则按项目排序必须出现在选择列表中

但是,如果我改变上述内容以避免使用参数:

ORDER BY CASE WHEN 0 = 0 then [CategoryTypeID] ELSE [SortOrder] end

有效。当该参数实际上没有按顺序使用时,为什么我使用参数时会感到不快?我甚至尝试在select语句中包含参数,但它仍然给了我同样的错误。

我也试过在1等时做@sort案例但得到了相同的结果。我确实在我的存储过程中声明了参数 - @sort int = 0

这是MSSQL 2012 express

编辑 - 为了更加清晰

 ORDER BY CASE WHEN @sort = 0 then [SortOrder] ELSE [CategoryTypeID] end

ORDER BY CASE WHEN @sort = 0 then [CategoryTypeID] ELSE [CategoryTypeID] end

这两个语句都失败,并且“必须出现在选择列表中”错误。我并没有试图同时使用这两种说法。只是给他们作为例子,列本身似乎不是一个问题。它使用看似问题的参数,即使参数本身未被选择或被排序。

2 个答案:

答案 0 :(得分:4)

CASE WHEN 0 = 0 then [CategoryTypeID] ELSE [SortOrder] end在编译时解析并简化为CategoryTypeID

你可以做到

WITH T
     AS (SELECT [CategoryTypeID],
                [SortOrder]
         FROM   T1
         UNION
         SELECT [CategoryTypeID],
                [SortOrder]
         FROM   T2)
SELECT *
FROM   T
ORDER  BY CASE
            WHEN @sort = 0 THEN [CategoryTypeID]
            ELSE [SortOrder]
          END 

或者

SELECT [CategoryTypeID],
       [SortOrder],
       CASE
         WHEN @sort = 0 THEN [CategoryTypeID]
         ELSE [SortOrder]
       END AS S
FROM   T1
UNION
SELECT [CategoryTypeID],
       [SortOrder],
       CASE
         WHEN @sort = 0 THEN [CategoryTypeID]
         ELSE [SortOrder]
       END AS S
FROM   T2
ORDER  BY S 

答案 1 :(得分:2)

AFAICT SQL Server不支持这样的语句,如错误所示。您可以使用IF构造根据参数进行不同的排序。

IF @sort=0
    SELECT ... ORDER BY CategoryTypeID;
ELSE
    SELECT ... ORDER BY SortOrder;