5

在一个简单的INSERT命令上,我收到一个错误:

转换数据类型时出错...

源数据有多个来源,组合起来有数十万行。

我可以重写我的语句以捕获错误并显示有问题的数据吗?

谢谢!

编辑:

代码请求:

insert Table_A 
  ([ID]
  ,[rowVersion]
  ,[PluginId]
  ,[rawdataId]
    ...
    ...
    ...
    )
select [ID]
      ,[rowVersion]
      ,[PluginId]
      ,[rawdataId]
       ...
       ...
       ...
FROM TABLE_B
4

3 回答 3

6

这是我在处理这个问题时采取的两种方法。该问题是由从字符串到日期的隐式转换引起的。

如果您碰巧知道正在转换哪个字段(在您的示例中可能是这样,但在我的示例中并非总是如此),那么只需执行以下操作:

select *
from table_B
where isdate(col) = 0 and col is not null

这可能并不适合所有数据类型,但在实践中对我来说效果很好。

有时,当我想在select语句中找到有问题的行时,我会运行select,将数据输出为文本而不是网格。这是 SSMS 中的选项之一,位于菜单下方的图标行中。它将输出错误之前的所有行,这可以让您识别有错误的行。这在有order by子句时效果最好,但出于调试目的,它对我有用。

在您的情况下,我可能会创建一个包含字符串的临时表,然后对这个临时表进行分析,特别是如果 Table_B 不是真正的表而是更复杂的查询。

于 2013-04-08T06:53:18.737 回答
1

查询语句insert into...select select ... into ... from 没有能力找到有问题的数据。相反,您可以使用BCP设置max_erros并将err_files所有有问题的数据输出到错误文件中。然后您可以简单地分析错误文件以查找所有违规行。
[MSDN BCP] 1

于 2013-04-08T06:54:20.797 回答
1

一种解决方案是进行二进制搜索以找到有问题的值。您可以按列和按行执行此操作:

  • 尝试只插入一半的列,如果这适用于另一半列。

  • 尝试只插入一半的行数。如果这对另一半有效。

并重复,直到你发现问题。

于 2013-04-08T06:54:29.627 回答