[英]SQL Server CASE in ORDER BY clause in stored procedure
我在這里有這個ORDER BY
子句:
ORDER BY
CASE WHEN @isAlphabeticalSort = 1 THEN itemName ELSE itemId END
我在存儲過程中定義了@isAlphabeticalSort
,如下所示:
@isAlphabeticalSort bit = 1
當我將@isAlphabeticalSort
設置為0來運行存儲過程時:
@isAlphabeticalSort = 0
它按預期方式工作,在運行存儲過程時將其設置為1時,出現此錯誤:
從字符串轉換日期和/或時間時轉換失敗。 警告:通過合計或其他SET操作消除了空值。
我在@isAlphabeticalSort = 0
下也有紅線表示:
@isAlphabeticalSort不是過程中的參數
我的問題是,我對布爾值的定義是否錯誤? 我的按訂單排序的情況是否錯誤? 我究竟做錯了什么?
使用CASE
表達式時,嘗試返回的數據類型是數據類型優先級最高的數據類型。 在這種情況下,您的CASE
表達式中有2列itemName
(假定為varchar
)和itemID
(假定為datetime
)。 datetime
具有更高的優先級,因此如果尚未將任何返回值都隱式轉換為datetime
。
因此,正確的方法是:
ORDER BY CASE WHEN @isAlphabeticalSort = 1 THEN itemName END,
CASE WHEN @isAlphabeticalSort = 0 THEN itemId END, --As recommended by @JamesZ
[Other Columns];
兩列都必須具有相同的類型,您可以嘗試這樣的操作
ORDER BY CASE WHEN @isAlphabeticalSort = 1 THEN itemName
ELSE CONVERT(varchar(10), itemId, 102) -- as recommended by Lamu
END
該錯誤歸因於您的列itemName(varchar?)和itemId(int?)。 您只能在Case語句中使用相同的數據類型。
https://docs.microsoft.com/zh-cn/sql/t-sql/language-elements/case-transact-sql#arguments
“ else_result_expression和任何result_expression的數據類型必須相同或必須是隱式轉換。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.