我有一个相当简单的分页查询,用于从表中获取行
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
时出现以下错误:
“从字符串转换日期和/或时间时转换失败。”
我遇到的问题是我不想转换任何东西?
答案 0 :(得分:19)
You'll need to divide your ORDER BY
into multiple CASE
statements:
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
返回的日期时间,因此您会收到转换错误。
答案 1 :(得分:0)
由于您没有明确地转换“按个别排序...”值,SQL Server会推断它是一个日期时间(根据第一种情况的类型)。
您的问题的解决方案是以字符串格式投射日期,允许您按顺序排序,有点像'yyyyMMddhhmmss'。如果您这样做,所有“按个别情况排序......”值将是字符,它将起作用。
或者,您可以选择两个,然后使用if选择其中一个。 if的第一部分是日期,第二部分是标题。