我这里有这个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(: 返回 types
两列需要具有相同的类型,您可以尝试这样的事情
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://learn.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql#arguments
"else_result_expression和任何result_expression的数据类型必须相同,或者必须是隐式转换。