存储过程中 ORDER BY 子句中的 SQL Server CASE



我这里有这个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的数据类型必须相同,或者必须是隐式转换。

最新更新