SQL Server 2008 在 ROW_NUMBER() 中对日期进行排序
以下查询生成一条错误消息
(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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
case
表达式的所有分支都将转换为 最高优先级。datetime
的优先级高于varchar
,因此它会尝试将AccessionNumber
值转换为datetime
。您可以使用显式转换为sql_variant
,如下所示。您应该知道这种动态排序条件不会使用索引来避免排序。
All branches of the
case
expression will be cast to the data type of the branch with the highest precedence.datetime
has higher precedence thanvarchar
so it will try and castAccessionNumber
values todatetime
. You can use an explicit cast tosql_variant
as below.You should be aware this kind of dynamic sort condition will not use an index to avoid a sort.
这必须这样做。
即:首先按一列排序,然后按另一列排序..像这样..
This has to be done like this.
ie : First Order By one colunm THEN BY another .... like this..