2015-12-08 37 views
0

萨拉姆使用它在“排序依据”条款忽略,情况下,当我在SQL Server存储过程

我使用CASEEND以指定的列在ORDER BY子句中使用。 但问题是,即使我通过"Total"程序,该程序忽略子句,但它通过"ProductCode"时正常工作。

这里是有这个问题的一部分:

ORDER BY  
      CASE  
       WHEN @ORDER_BY1='ProductCode' THEN CAST(dbo.Items.ProductCode AS NVARCHAR) 
       --When I pass 'Total' in this procedure, it ignores it. So it won't be ordered by Total 
       WHEN @ORDER_BY1='Total' THEN CAST(COUNT(*) AS NVARCHAR) 
      END ASC, 
      CASE  
       WHEN @ORDER_BY2='ProductCode' THEN CAST(dbo.Items.ProductCode AS NVARCHAR) 
       --When I pass 'Total' in this procedure, it ignores it. So it won't be ordered by Total 
       WHEN @ORDER_BY2='Total' THEN CAST(Count(*) AS NVARCHAR) 
      END ASC 
+0

Erm。对于每一行,'COUNT(*)'总是不变吗?在这种情况下,您将按照每行总是相同的顺序进行排序,因此行可以以任何顺序返回,对吗?我的猜测是它不会忽略这个子句,但是完全按照你所说的去做...... –

+0

Thanks @MattGibson,你说得很对,该子句将“Count()”当作字符串,所以12来到2.我解决了它将它转换为INT。 –

回答

0

感谢Damien_The_Unbeliever

该子句未被忽略,但为了在ORDER BY子句中使用COUNT(*),它必须是数值。因为每个CASE应该产生一个数值类型,所以代码应该是这样的:

ORDER BY  

      CASE 
       WHEN @ORDER_BY1='Total' THEN CAST(COUNT(*) AS INT) 
       WHEN @ORDER_BY2='Total' THEN CAST(Count(*) AS INT) 
      END ASC, 

      CASE  
       WHEN @ORDER_BY1='ProductCode' THEN CAST(dbo.Items.ProductCode AS NVARCHAR) 
       WHEN @ORDER_BY2='ProductCode' THEN CAST(dbo.Items.ProductCode AS NVARCHAR) 
      END ASC 
+0

现在应该为'ProductCode'产生错误,除非'ProductCode'值恰好可以转换为'int's。 'CASE'是一个*表达式* - 它必须产生一个特定的* type *值。鉴于现在正在使用的类型和优先级,它将尝试将所有内容都转换为“int”。 –

+0

请参阅[此答案](http://stackoverflow.com/a/20097116/15498)如果它确实现在导致问题。 –

+0

为什么它会导致错误@Damien_The_Unbeliever? 'ProductCode'不是数字值。所以当我使用'order by'时,结果将按照代码排序。如果它是一个常规查询,则默认类型'ProductCode'为'NVARCHAR',对于COUNT(*)则为'INT' –