2014-03-04 65 views
0

正常工作,我在與使用CASE語句來改變我的ORDER BY語句在存儲過程中的問題。情況下不得在SQL Server存儲過程

我送一個參數,@sortBy,其中包含列通過命令的名稱。

我的問題是,CASE語句也適用於大多數列,但不是別人:

SELECT * FROM TapeView 
       ORDER BY 
        CASE 
         WHEN @sortBy = 'BackupJobType' THEN [BackupJobType] 
         WHEN @sortBy = 'ItemID' THEN [ItemID] 
         WHEN @sortBy = 'MediaType' THEN [MediaType] 
         WHEN @sortBy = 'Category' THEN [Category] 
         WHEN @sortBy = 'Description' THEN [Description] 
         WHEN @sortBy = 'PlantName' THEN [PlantName] 
         WHEN @sortBy = 'BackupType' THEN [BackupType] 
         WHEN @sortBy = 'UserID' THEN [UserID] 
        END 

出於某種原因,這工作得很好,每列除BackupJobTypeDescription

我已經檢查了正在發送的參數值和列的名稱,並且是100%肯定,他們是正確的。

我有另一個頁面上的幾乎相同的查詢,這兩列的工作正常那裏。

任何想法?

編輯:我忘了提,所有這些列是VARCHAR數據類型

+2

發佈一些樣本輸出給我們展示了它是如何不工作。 – user2989408

+0

原因可能與所有必須轉換爲相同類型的列有關。沒有例子,很難說出發生了什麼。 –

+0

它是如何不工作的問題仍然適用。 – Andrew

回答

2

如果@sortBy存儲過程參數或局部變量的數據類型小於「Description」的長度,即varchar(11),那麼這就是你的問題。例如,如果@sortBy爲varchar(10),則「描述」變爲「DESCRIPTIO」(第一個10個字符)和「BackupJobType」變成「BackupJobT」,但其他的列名適合。如果是這種情況,請將過程參數和/或局部變量的@sortBy數據類型更改爲varchar(128)。

+0

那是我在一段時間內犯的一個愚蠢錯誤,就是這樣。謝謝 – McFixit

1

的問題可能是由類型引起的。我認爲id也是一個問題,如果它們是數字。

把每個條件在一個單獨的條款應解決此問題:

ORDER BY (CASE WHEN @sortBy = 'BackupJobType' THEN [BackupJobType] END), 
     (CASE WHEN @sortBy = 'ItemID' THEN [ItemID] END), 
     (CASE WHEN @sortBy = 'MediaType' THEN [MediaType] END), 
     (CASE WHEN @sortBy = 'Category' THEN [Category] END), 
     (CASE WHEN @sortBy = 'Description' THEN [Description] END), 
     (CASE WHEN @sortBy = 'PlantName' THEN [PlantName] END), 
     (CASE WHEN @sortBy = 'BackupType' THEN [BackupType] END), 
     (CASE WHEN @sortBy = 'UserID' THEN [UserID] END) 

不匹配的將所有的產品NULL S,所以他們不會影響排序中的條款。

+0

當我有機會時,我會試試這個,但是我應該指出,這是一個較大查詢的較小子集,它具有用於整理不同數據類型的IF語句。這個列表中的所有東西都是一個varchar類型 – McFixit

+0

我試過了,它產生了相同的結果 – McFixit

+1

@McFixit。 。 。那麼,列的類型不是問題。我的下一個懷疑是你對排序應該是什麼的期望是錯誤的。你能編輯你的問題,並提供排序的例子嗎? –