繁体   English   中英

为什么 SQL 服务器不能告诉我是哪个列导致了错误

[英]Why can't SQL Server tell me which column is causing the error

我正在运行一个非常标准的

INSERT INTO [table] (col1, col2, ...coln)
select * from #temp

我收到以下错误:

消息 245,16 级,State 1,第 1 行
将 varchar 值“NULL”转换为数据类型 int 时转换失败。

我了解该错误,但想知道导致问题的列为何未由错误消息标识。 有没有一种简单的方法可以找到哪一列包含顽皮的 null,或者这只是一种让我看起来工作效率很高的策略,而实际上我只是花了 30 分钟查看一个巨大的结果集而一无所获?

编辑:感谢您的帮助,但没有人真正回答这个问题。 所有 RDBMS 发出的类似错误消息是否更有用? 它的 2012 年......对可能数以千计的专栏的反复试验应该已经死了!

我会看看你如何填充临时表。 您似乎获得的值为“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')

它不应该花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,那么你应该能够得到你想要的结果。

如果您在查询之前运行这两个语句,您将在结果集中的这些列上看到 null 个值:

SET ARITHABORT OFF 
SET ANSI_WARNINGS OFF

@Jeremy指出,你需要一些试验和错误。 但你可以放下选择。

错误消息表明varchar列中的问题是NULL。 您可以将搜索限制为#temp中的varchar列: select * from #temp where col1 is null or col3 is null

其次,当数据库引擎尝试将null varchar值转换integer not nullinteger not null时,也会出现问题。 比较两个表的定义,以查看#temp中的varchar与另一个表中的非integer not null匹配的位置。

然而,这是可疑的。 为什么要尝试将文本转换为数字? 如果这是你真正想做的事情,你可能需要从文本到数字的显式转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM