我正在处理一个较大的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行时,很难说出是什么引发了错误。
答案 0 :(得分:4)
SQL Server并不容易做到这一点。我发现有必要采用暴力手段。我喜欢从将数据加载到所有表都是字符串的登台表开始。这使操作更容易。
您可以使用两种方法之一来查找错误。首先是在每一列上使用try_convert()
来确定错误的位置。
第二种方法是执行二进制搜索以找到有问题的行。加载数据的前半部分以查看是否存在错误。然后将那一半分成两半。依此类推。
答案 1 :(得分:0)
添加空白行前后的错误看起来是相同的。这可能是数据类型转换问题。您可以尝试使用cast()函数,并在MtgeMktg表的选择字段中转换[Col1]的数据类型,使其与MtgeMaster表的[Col1]的数据类型相匹配。
答案 2 :(得分:0)
因此,这是我根据给出的内容尝试回答此问题的尝试。
我将回顾MtgeMaster的表结构,并查看哪些列应为数字。只是说,对于此示例,MtgeMaster的Col3是数字。您可能有多个数字列。
然后我将查询MtgeMktg,并检查您尝试从MtgeMktg保存到MtgeMaster的列是否为数字。您可能必须对MtgeMaster中每个数字列执行此操作。如果我这样做(这是我在SQLFiddle中所做的),那么这将具有以下本质:
select * from MtgeMktg where ISNUMERIC(Col3) = 0
列出了简单的小提琴here:
很明显,此时您将要做出2个决定中的1个。修复数据,或过滤掉其中包含非数字数据的行。我想您还是需要这些行。