2011-11-03 86 views
1

下面的查詢產生的錯誤信息的SQL Server 2008數據排序()

(SELECT ROW_NUMBER() OVER(ORDER BY (CASE @SortBy 
    WHEN 'AccessionNumber' THEN [AccessionNumber] 
    WHEN 'CreatedDate' THEN CreatedDate 
END))AS RowNumber 

@SortBy VARCHAR(50) = 'AccessionNumber' 

作爲參數傳遞。

錯誤:

varchar數據類型到datetime數據類型的轉換導致外的範圍內的值。

回答

0

這必須這樣做。

(SELECT ROW_NUMBER() OVER 
     (
      -- Dynamic sorting 
      ORDER BY 
       CASE WHEN @SortBy = 'AccessionNumber' THEN [AccessionNumber] END Asc , 
       CASE WHEN @SortBy = 'CreatedDate' THEN CreatedDate END Asc 
      ) as RowNo 

即:一階屆時一個colunm由另一個....這樣的..

+0

它不** **必須要幹這種事情做我的答案節目。 –

4

case表達式的所有分支將轉換爲the highest precedence分支的數據類型。

datetime具有比varchar更高的優先級,因此它會嘗試將AccessionNumber的值轉換爲datetime。如下所示,您可以使用明確演員陣容到sql_variant

CASE @SortBy 
    WHEN 'AccessionNumber' THEN cast([AccessionNumber] as sql_variant) 
    WHEN 'CreatedDate' THEN CreatedDate 
END 

你應該知道這種動態排序條件不會使用索引來避免排序。