簡體   English   中英

存儲過程中ORDER BY子句中的SQL Server CASE

[英]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];

供參考: 數據類型優先(Transact-SQL)CASE(Transact-SQL):返回類型

兩列都必須具有相同的類型,您可以嘗試這樣的操作

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM