SQL Server 2008 在 ROW_NUMBER() 中对日期进行排序

发布于 2024-12-13 14:55:09 字数 389 浏览 0 评论 0原文

以下查询生成一条错误消息

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

,其中

@SortBy VARCHAR(50) = 'AccessionNumber' 

作为参数传递。

错误 :

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

The following query generate an error message

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

Where

@SortBy VARCHAR(50) = 'AccessionNumber' 

passed as parameter.

Error :

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

攒一口袋星星 2024-12-20 14:55:09

case 表达式的所有分支都将转换为 最高优先级

datetime 的优先级高于 varchar,因此它会尝试将 AccessionNumber 值转换为 datetime。您可以使用显式转换为 sql_variant,如下所示。

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

您应该知道这种动态排序条件不会使用索引来避免排序。

All branches of the case expression will be cast to the data type of the branch with the highest precedence.

datetime has higher precedence than varchar so it will try and cast AccessionNumber values to datetime. You can use an explicit cast to sql_variant as below.

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

You should be aware this kind of dynamic sort condition will not use an index to avoid a sort.

暮光沉寂 2024-12-20 14:55:09

这必须这样做。

(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 

即:首先按一列排序,然后按另一列排序..像这样..

This has to be done like this.

(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 

ie : First Order By one colunm THEN BY another .... like this..

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文