我正在运行一个非常标准的
INSERT INTO [table] (col1, col2, ...coln)
select * from #temp
我收到以下错误:
Msg 245,Level 16,State 1,Line 1
将varchar值'NULL'转换为数据类型int时,转换失败。
我理解错误,但想知道错误消息未识别导致问题的列的原因。有没有一种简单的方法可以找到哪个列包含顽皮的null,或者这只是一个让我看起来像工作效率高的工作,而我真的花了30分钟看着一个巨大的结果集而没有到达任何地方?
编辑:感谢帮助人员,但没有人真正回答这个问题。是否所有RDBMS都会发出类似的错误消息或者更有用?它的2012年...可能数千列的试验和错误应该已经死了!
答案 0 :(得分:4)
我会看看你如何填充临时表。您似乎获得的值为“null”而不是NULL。如果此数据来自Excel文件,则这是一个常见问题。我通常通过这种方式更新数据:
Update #temp
set field1 = NULL
where field1 = 'NULL'
如果要在同一更新命令中执行所有操作,则
Update #temp
set field1 = NULLIF(field1, 'NULL')
, field2 = NULLIF(field2, 'NULL')
, field3 = NULLIF(field3, 'NULL')
答案 1 :(得分:1)
不应该花30分钟来确定null的位置。你只有这么多列。刚开始从#temp中选择WHERE col1 IS NULL,然后是WHERE col2。
如果#temp有一个VARCHAR列,你试图将其放入INT列然后进行转换。如果有NULL,您可能希望使用CAST(ISNULL(VarCharColumn,'0')AS INT)处理它们。如果INT列允许NULLS,那么只需要转换为INT就足够了(只要所有值都是NULL或有效的int)。
如果你更谨慎地编写INSERT,那么你应该能够得到你想要的结果。
答案 2 :(得分:0)
@Jeremy指出,你需要一些试验和错误。但你可以放下选择。
错误消息显示varchar列中的问题为NULL。您可以将搜索范围限制在#temp:select * from #temp where col1 is null or col3 is null
其次,当数据库引擎尝试将null varchar值转换为integer not null
时,也会出现问题。比较两个表的定义,以查看#temp中的varchar与另一个表中的integer not null
匹配的位置。