1

我有一个存储过程,其中包含由联合连接的 3 个查询。这行得通。它目前有一个按值设置的顺序,如下所示:

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

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

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

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

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

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

这样可行。为什么当我使用一个参数而实际上并没有按顺序使用该参数时会不高兴?我什至尝试在选择语句中包含参数,但它仍然给了我同样的错误。

我也尝试过 case @sort when 1 etc,但得到了相同的结果。我确实在我的存储过程中声明了参数 - @sort int = 0

这是 MSSQL 2012 快递

编辑 - 为了更加清晰

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

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

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

4

2 回答 2

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 
于 2013-06-03T19:49:28.643 回答
2

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

IF @sort=0
    SELECT ... ORDER BY CategoryTypeID;
ELSE
    SELECT ... ORDER BY SortOrder;
于 2013-06-03T19:55:41.747 回答