SQL Server按大小写排序-是从日期/时间转换为字符串吗?

时间:2018-07-31 16:17:40

标签: sql sql-server tsql

我正在尝试创建一个存储过程,该存储过程将允许调用者指定是否要按列排序。该参数应该是可选的。我正在使用SQL Server Express

@sortBy VARHCAR(255) = ''


BEGIN

        SELECT * FROM Document
        ORDER BY
        CASE @sortBy
            WHEN 'documentId' THEN documentId
            WHEN 'documentName' THEN documentName
            WHEN 'dateCreated' THEN dateCreated
            WHEN 'dateLastAccessed' THEN dateLastAccessed
            ELSE documentName
        END;
END

我可以创建该过程,但是当我执行该过程时,会收到以下消息

Conversion failed when converting date and/or time from character string.

dateCreated和dateLastAccessed的类型为DATE,但我无法确定它们是否是罪魁祸首。我是否意外地告诉数据库使用此过程转换日期/时间?这是我第一次使用存储过程的可选参数,因此我可能做的不正确。感谢您的帮助

谢谢

2 个答案:

答案 0 :(得分:3)

正如Tim和Sean在评论中所写,case表达式只能返回单个数据类型。
当每个选项包含不同的数据类型时,SQL Server尝试将所有数据类型隐式转换为优先级更高的数据类型(see the list here)。

您可以通过使用稍微麻烦一些的查询来克服此问题:

SELECT * 
FROM Document
ORDER BY
CASE WHEN @sortBy = 'documentId' THEN documentId END,
CASE WHEN @sortBy = 'documentName' THEN documentName END,
CASE WHEN @sortBy = 'dateCreated' THEN dateCreated END,
CASE WHEN @sortBy = 'dateLastAccessed' THEN dateLastAccessed END;

请注意,如果不指定else部分,则case表达式将返回null-这样就不会影响记录的整体顺序。

答案 1 :(得分:0)

首先,动态排序不适用于混合数据类型。也就是说,如果您具有要按其排序的不同数据类型的字段-例如varchars和date。您需要使用CONVERT将不匹配的数据类型转换为与其他数据类型相同的数据类型。或者您可以使用动态sql。也许更容易:))

n=(df.shape[1]-1)//2

df[df.eq(0).sum(1)<n]
Out[589]: 
          1  2   3   4   5
0  ENSG0001  0  74  54   2
2  ENSG0003  3   4   2  24