2013-04-08 70 views
4

在一个简单的INSERT命令,我得到一个错误:T-SQL - 错误转换数据类型 - 显示违规行

Error converting data type...

源数据有多个来源,并相结合,使数十万行的。

我可以重写我的声明来捕捉错误并显示有问题的数据吗?

谢谢!

编辑:

请求代码:

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

这将有助于如果我们能看到您的查询......也许一些数据。 – 2013-04-08 06:34:30

+0

而...查询在哪里? – valex 2013-04-08 06:34:44

+0

@Warren向我们显示您的代码 – Alex 2013-04-08 06:34:59

回答

6

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

如果你碰巧知道正在转换这领域(这可能是真实的在你的榜样,但并不总是在我的),那么就这样做:

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

这可能不是完美的所有数据类型,但它在实践中对我很好。我想运行select,将数据输出到文本而不是网格中。这是SSMS中的一个选项,沿着菜单下的一排图标。它将输出错误之前的所有行,这种类型可以让您识别出具有错误的行。当存在order by子句时,此方法效果最佳,但为了调试目的,它适用于我。

在你的情况,我可能会创建一个保存字符串一个临时表,然后做了分析这个临时表,特别是当表-B是不是一个真正的表,但一个更复杂的查询。

1

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

1

一种解决方案是做一个binary search找到有问题的值(一个或多个)。您可以在两柱和行做:

  • 尝试插入只有一半的列,如果这样可以列的另一半。

  • 尝试将只有一半的行数。如果这在另一半工作。

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