9

我有一个相当简单的分页查询,用于从表中获取行

ALTER PROCEDURE mytable.[news_editor_paginate]
    @count int,
    @start int,
    @orderby int
AS
BEGIN
    SET NOCOUNT ON;
    SELECT TOP (@count) * FROM 
    (  
        SELECT news_edits.*,
        ROW_NUMBER() OVER (
            ORDER BY CASE 
                WHEN @orderby = 0 THEN news_edits.[time]
                WHEN @orderby = 1 THEN news_edits.lastedit
                WHEN @orderby = 2 THEN news_edits.title
                END
            DESC
        ) AS num
        FROM news_edits
    ) AS a
    WHERE num > @start
END

@orderby参数决定结果应按哪一列排序。

news_edit.[time]并且news_edits.lastedit都是日期时间字段。但是news_edits.title是一个varchar字段。

查询对于两个日期时间字段都运行良好,但是当@orderby = 2我收到以下错误时:

“从字符串转换日期和/或时间时转换失败。”

我遇到的问题是我没有尝试转换任何东西?

4

2 回答 2

20

您需要将您的语句ORDER BY分成多个CASE语句:

ORDER BY 
    CASE WHEN @orderby = 0 THEN news_edits.[time] END DESC,
    CASE WHEN @orderby = 1 THEN news_edits.lastedit END DESC,
    CASE WHEN @orderby = 2 THEN news_edits.title END DESC

这是因为单个CASE语句要求所有分支都具有兼容的数据类型。由于您的字符串CASE无法转换为从另一个返回的日期时间CASE,因此您会收到转换错误。

于 2012-04-03T22:33:19.380 回答
0

由于您没有显式转换“按大小写...”值,SQL Server 推断它是一个日期时间(根据第一种情况的类型)。

您的问题的解决方案是将日期转换为允许您按其排序的字符串格式,有点像“yyyyMMddhhmmss”。如果这样做,所有“按大小写...”值都将是字符并且它会起作用。

或者,您可以有两个选择,并使用 if 选择其中一个。if 的第一部分用于日期,第二部分用于标题。

于 2012-04-03T22:40:32.693 回答