【发布时间】:2013-06-03 19:40:19
【问题描述】:
我有一个存储过程,其中包含 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 语句中包含参数,但它仍然给了我同样的错误。
我也尝试过 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
这两个语句都失败,并出现“必须出现在选择列表中”错误。而且我并没有尝试同时使用这两个语句。只是将它们作为示例,列本身似乎不是问题。它使用的参数似乎是一个问题,即使参数本身没有被选择或排序。
【问题讨论】:
-
您的 SELECT 列表中有什么......?您实际上需要选择这个。
-
因为在第二种情况下永远不会到达
ELSE,所以 SQL Server 就好像它不存在一样。尝试将其更改为WHEN 1 = 0。SortOrder在您的SELECT列表中吗?如果没有,为什么不呢? -
对不起,如果我不清楚 - 如果您查看第一行示例代码,那就可以了。意思是,所有 3 列都在选择中。因此,永远不会达到 else 并不重要。我可以交换 else 中的哪一列并得到相同的结果。出于某种原因,它只是不喜欢正在使用的参数
标签: sql-server parameters sql-order-by