1

次のクエリはエラーメッセージを生成します

(SELECT ROW_NUMBER() OVER(ORDER BY (CASE @SortBy
    WHEN 'AccessionNumber' THEN  [AccessionNumber]
    WHEN 'CreatedDate' THEN  CreatedDate
END))AS RowNumber

どこ

@SortBy VARCHAR(50) = 'AccessionNumber' 

パラメータとして渡されます。

エラー :

varcharデータ型を日時データ型に変換すると、値が範囲外になりました。

4

2 に答える 2

4

式のすべてのブランチは、優先順位が最も高いcaseブランチのデータ型にキャストされます。

datetimeよりも優先順位が高いため、値をにvarcharキャストしようとします。以下のように明示的なキャストを使用できます。AccessionNumberdatetimesql_variant

CASE @SortBy
    WHEN 'AccessionNumber' THEN  cast([AccessionNumber] as sql_variant)
    WHEN 'CreatedDate' THEN  CreatedDate
END

この種の動的ソート条件では、ソートを回避するためにインデックスが使用されないことに注意してください。

于 2011-11-03T13:49:21.917 に答える
0

これはこのように行わなければなりません。

(SELECT ROW_NUMBER() OVER 
         (
            -- Dynamic sorting
            ORDER BY 
               CASE WHEN  @SortBy = 'AccessionNumber'  THEN [AccessionNumber] END Asc ,
               CASE WHEN  @SortBy = 'CreatedDate' THEN CreatedDate END  Asc
              ) as  RowNo 

すなわち:ある列による最初の注文、次に別の列による....このように..

于 2011-11-03T13:59:19.207 に答える