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ステートメントでは、すべての分岐に互換性のあるデータ型が必要なためです。1 つの文字列をCASE別の から返された日時に変換できないCASEため、変換エラーが発生します。

于 2012-04-03T22:33:19.380 に答える
0

「ケースバイケース...」値を明示的にキャストしていないため、SQL Server はそれが日時であると推測します (最初のケースの型に従って)。

問題の解決策は、「yyyyMMddhhmmss」のように、日付を順序付けできる文字列形式にキャストすることです。そうする場合、すべての「ケースバイケース...」の値は文字になり、機能します。

または、2 つの選択を行い、そのうちの 1 つを if で選択することもできます。if の最初の部分は日付、2 番目はタイトルです。

于 2012-04-03T22:40:32.693 に答える