2015-12-08 71 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' –