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

时间:2018-04-10 13:38:21

标签: sql sql-server stored-procedures

我在这里有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不是程序中的参数

我的问题是,我是否定义了我的布尔错误?在我的订单条款中我的情况是错误的吗?我做错了什么?

3 个答案:

答案 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的数据类型必须相同或必须是隐式转换。”