【问题标题】:Can't find which row is causing conversion error找不到导致转换错误的行
【发布时间】:2010-05-20 06:32:24
【问题描述】:

我有下表:

CREATE TABLE [dbo].[Accounts1](
    [AccountId] [nvarchar](50) NULL,
    [ExpiryDate] [nvarchar](50) NULL
)

我正在尝试使用此查询将 nvarchar 转换为日期时间:

select convert(datetime, expirydate) from accounts

我收到此错误:

Conversion failed when converting datetime from character string.

状态栏显示“2390 行”。我转到第 2390、2391 和 2392 行。那里的数据没有问题。我什至尝试转换那些特定的行并且它有效。如何找出导致转换错误的行?

【问题讨论】:

  • 您是否检查过紧接在此上方的行?您还可以尝试将一半的行复制到一个新表中,适当地修改您的查询,如果您没有收到错误,请再次拆分剩余的行,直到您可以找到确切的记录。您可能还想尝试按该列对数据库进行排序,任何奇怪的值都可能出现在您身上。
  • 这也有助于了解该表中有多少条记录。

标签: sql-server primary-key type-conversion


【解决方案1】:

试试:

SELECT * FROM [dbo].[Accounts1] WHERE ISDATE(ExpiryDate) = 0

这是我的测试代码:

CREATE TABLE #t( 
    [ExpiryDate] [nvarchar](50) NULL 
) 

insert into #t (ExpiryDate)
select '1/1/2010'

insert into #t (ExpiryDate)
select 'foo'

insert into #t (ExpiryDate)
select '2/1/2010'

select * from #t where ISDATE(ExpiryDate) = 0
-- returns 1 row

drop table #t

【讨论】:

    【解决方案2】:

    此表没有主键。在没有它的情况下,不能保证表查看器和查询以相同的顺序运行,因此 2390 表示不同的行。一旦创建了主键,运行查询时显示的行号将与表视图上的行号匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多