Sql server 2008 如何在使用SQLServer2008的CASE语句中同时使用varchar和Datetime数据类型?

Sql server 2008 如何在使用SQLServer2008的CASE语句中同时使用varchar和Datetime数据类型?,sql-server-2008,stored-procedures,sql-order-by,Sql Server 2008,Stored Procedures,Sql Order By,我有一个存储过程,我正在使用这个变量,即@orderBy 下面是我的代码: ORDER BY CASE WHEN @orderBy = 'ClientName' THEN c.LastName WHEN @orderBy = 'EmployerName' THEN cda.Name WHEN @orderBy = 'EmploymentDate' THEN cda.StartDate END

我有一个存储过程,我正在使用这个变量,即
@orderBy

下面是我的代码:

ORDER BY
        CASE 
            WHEN @orderBy = 'ClientName' THEN c.LastName
            WHEN @orderBy = 'EmployerName' THEN cda.Name
            WHEN @orderBy = 'EmploymentDate' THEN cda.StartDate
        END
问题是当我使用
@orderBy
变量时,它是一个varchar,并且在第三行给出了错误:

将字符串转换为smalldatetime数据类型时,
转换失败。
如果我在@orderBy='EmploymentDate'时注释第三行,即
,然后在cda.StartDate

如何克服此数据类型转换错误

提前感谢。

请尝试更换

WHEN @orderBy = 'EmploymentDate' THEN cda.StartDate


您可以使用每列一个大小写来删除混合类型

ORDER BY
    CASE WHEN @orderBy = 'ClientName' THEN c.LastName END,
    CASE WHEN @orderBy = 'EmployerName' THEN cda.Name END,
    CASE WHEN @orderBy = 'EmploymentDate' THEN cda.StartDate END

您必须分离数据类型

ORDER BY
    CASE 
        WHEN @orderBy = 'ClientName' THEN c.LastName
        WHEN @orderBy = 'EmployerName' THEN cda.Name
        ELSE ''
    END,
    CASE 
        WHEN @orderBy = 'EmploymentDate' THEN cda.StartDate
        ELSE '19000101'
    END
或者将smalldatetime转换为varchar,但保留排序逻辑

ORDER BY
    CASE 
        WHEN @orderBy = 'ClientName' THEN c.LastName
        WHEN @orderBy = 'EmployerName' THEN cda.Name
        --gives "yyyy-mm-ddThh:mm:ss.mmm "
        WHEN @orderBy = 'EmploymentDate' THEN CONVERT(varchar(30), cda.StartDate, 121)
    END

或者根据AlexK的回答,有3个单独的案例告诉我哪一个是更好的解决方案?你的还是另一个?告诉我哪一个更好?你的还是其他的?“2011年12月27日”将出现在“2011年6月28日”之前,因为她是对的。如果我们比较2011年6月28日下午1:26点和2011年8月1日下午1:26点,将不会保持上升顺序。您应该应用额外的格式或使用第二个答案解决方案。您可以按照gbn的答案中给出的方式进行转换,但我会选择每列的案例,因为在不需要转换的情况下,这更有效。好的,3个单独的案例更吸引我。感谢您的帮助查看本文。它写在2003年,但仍然相关。
ORDER BY
    CASE 
        WHEN @orderBy = 'ClientName' THEN c.LastName
        WHEN @orderBy = 'EmployerName' THEN cda.Name
        --gives "yyyy-mm-ddThh:mm:ss.mmm "
        WHEN @orderBy = 'EmploymentDate' THEN CONVERT(varchar(30), cda.StartDate, 121)
    END