【问题标题】:Getting error only when using select top 1000 query in sql仅在 sql 中使用 select top 1000 查询时出错
【发布时间】:2015-11-13 05:45:37
【问题描述】:

我有一个视图 xyz_view,它有大约 16,000 条记录。

有四个日期列具有这种格式的数据'2015-04-30 00:00:00.000'

当我使用查询时

select * 
from xyz_view

我得到所有记录没有任何问题,但是当我使用时

select top 1000 * 
from xyz_view

我收到一个错误:

消息 245,第 16 级,状态 1,第 1 行
将 varchar 值 '2013-08-05 00:00:00.0' 转换为数据类型 int 时转换失败。

即使select top 100 * from xyz_view 也有效。任何超过 300 的东西都会抛出错误。

请帮助我理解这一点。

【问题讨论】:

  • 请发布您正在使用的查询。
  • 当你只使用select *... 时,你真的得到了所有的记录,还是你的编辑器限制了返回的数量?
  • 您查询的是视图还是表?您的问题措辞表明您正在查看视图。
  • 这个错误甚至没有提到datetime。它说将varchar 转换为int。需要检查视图的定义。
  • @CaptainAdams:是的,我正在看风景。

标签: sql sql-server view


【解决方案1】:

我认为四列数据类型中的某些内容不是datetime 类型。因为你的值是:'2013-08-05 00:00:00.0'

如果是datetime类型,则为:'2013-08-05 00:00:00.000'(3个数字为毫秒)

在视图中,您可以将列转换或强制转换为日期时间类型,如下所示:

CAST(columns AS DATETIME)
CONVERT(DATETIME, columns)

【讨论】:

    【解决方案2】:

    您的 top

    错误检查仅在您获取数据类型为int 的列之一在其中获得date 值的行时运行 - 2013-08-05 00:00:00.0

    通过运行Select 语句检查此记录。

    SELECT * FROM myTable
    WHERE myColumn = '2013-08-05 00:00:00.0'
    

    根据您看到的记录,然后决定是否将错误的2013-08-05 00:00:00.0 更改为任何可接受的int

    UPDATE myTable
    SET myColumn = 123
    WHERE myColumn = '2013-08-05 00:00:00.0'
    

    【讨论】:

    • 多么糟糕的建议:只删除可能很重要的数据,而不是找出错误的原因!
    • DateINT 列中怎么可能是重要数据?即便如此,如果你再读一遍我确实说过他应该确保在进行Update之前先Select有问题的记录。
    • 不知道数据,就无法知道是否有必要。然而,一个好的开始假设是人们实际上需要他们存储的数据。此外,原则上这是调试错误的错误方法。它可能会使错误消失,但您对错误的根本原因一无所知,这意味着它可能会在将来再次发生(例如加载更多数据时)。
    • @CurseStacker: 但是 select * (without top) 查询包含错误数据并且没有抛出错误。
    • @curiousboy,至于你的问题,不给我们看代码是无法回答的。
    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多