追踪插入错误的最简单方法是什么?

时间:2019-09-10 21:24:29

标签: sql sql-server

我正在处理一个较大的Insert Into。 。选择 。 。来自。 。 此脚本中有超过500多行SQL,并且出现此错误:

INSERT INTO MtgeMaster (  [Col1]
      ,[Col2]
      ,[Col3]
      , etc., etc. )
SELECT  [Col1]
      ,[Col2]
      ,[Col3]
      , etc., etc.
FROM MtgeMktg

当我运行上面的代码时,出现此错误:

  

信息8114,第16级,状态5,第164行
  将数据类型varchar转换为数字时出错。

错误似乎来自第164行,但是第164行实际上是我的[Col1]字段,这是VARCHAR。所以,我要从VARCHAR转到VARCHAR。没有VARCHAR到NUMERIC。

此外,如果我添加几个空白行并重新运行该过程,则会得到以下提示:

  

信息8114,第16级,状态5,第166行
   将数据类型varchar转换为数字时出错。

它真正要做的只是与INSERT INTO子句对齐。

该错误一定是来自另一行,但是当我要经过500多个SQL行时,很难说出是什么引发了错误。

3 个答案:

答案 0 :(得分:4)

SQL Server并不容易做到这一点。我发现有必要采用暴力手段。我喜欢从将数据加载到所有表都是字符串的登台表开始。这使操作更容易。

您可以使用两种方法之一来查找错误。首先是在每一列上使用try_convert()来确定错误的位置。

第二种方法是执行二进制搜索以找到有问题的行。加载数据的前半部分以查看是否存在错误。然后将那一半分成两半。依此类推。

答案 1 :(得分:0)

添加空白行前后的错误看起来是相同的。这可能是数据类型转换问题。您可以尝试使用cast()函数,并在MtgeMktg表的选择字段中转换[Col1]的数据类型,使其与MtgeMaster表的[Col1]的数据类型相匹配。

答案 2 :(得分:0)

因此,这是我根据给出的内容尝试回答此问题的尝试。

  1. 我将回顾MtgeMaster的表结构,并查看哪些列应为数字。只是说,对于此示例,MtgeMaster的Col3是数字。您可能有多个数字列。

  2. 然后我将查询MtgeMktg,并检查您尝试从MtgeMktg保存到MtgeMaster的列是否为数字。您可能必须对MtgeMaster中每个数字列执行此操作。如果我这样做(这是我在SQLFiddle中所做的),那么这将具有以下本质:

select * from MtgeMktg where ISNUMERIC(Col3) = 0
  1. 此查询返回的所有内容都会告诉您哪些行具有非数字列。

列出了简单的小提琴here:

很明显,此时您将要做出2个决定中的1个。修复数据,或过滤掉其中包含非数字数据的行。我想您还是需要这些行。

相关问题