我在这里有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不是程序中的参数
我的问题是,我是否定义了我的布尔错误?在我的订单条款中我的情况是错误的吗?我做错了什么?
答案 0 :(得分:3)
使用CASE
表达式时,尝试返回的数据类型是具有最高数据类型优先级的数据类型。在这种情况下,您的CASE
表达式itemName
(我假设为varchar
)和itemID
(我假设在datetime
中)有2列。 datetime
具有更高的优先级,因此任何返回值都将隐式转换为datetime
(如果它们尚未存在)。
因此,正确的方法是:
ORDER BY CASE WHEN @isAlphabeticalSort = 1 THEN itemName END,
CASE WHEN @isAlphabeticalSort = 0 THEN itemId END, --As recommended by @JamesZ
[Other Columns];
供参考: Data Type Precendence (Transact-SQL)和 CASE (Transact-SQL): Return Types
答案 1 :(得分:2)
两个列都需要具有相同的类型,您可以尝试这样的
ORDER BY CASE WHEN @isAlphabeticalSort = 1 THEN itemName
ELSE CONVERT(varchar(10), itemId, 102) -- as recommended by Lamu
END
答案 2 :(得分:0)
错误是由于您的列itemName(varchar?)和itemId(int?)。您只能在Case语句中使用相同的数据类型。
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql#arguments
“else_result_expression和任何result_expression的数据类型必须相同或必须是隐式转换。”