SQL Server - "Column name or number of supplied value does not match table definition"



我知道过去有很多问题解决了这个问题,我理解为什么会出现这个错误。

我真的很想找到一个快捷方式,我的表有数百列,我不想手动筛选代码,根据字段定义检查值。当我尝试运行它时,错误消息总是指向同一个行号——上面有INSERT的行

有没有一种简单的方法可以让它指向有问题的实际字段?

编辑:看完给出的答案后,我意识到我根本不明白这条信息的原因。这只是一个缺失字段的结果,与不正确的数据类型无关。当我添加缺失的字段时,即使某些字段中的数据类型仍然错误,错误也会消失。

幸运的是,答案和评论理解了问题的实际原因,而不是我对它的评估,所以问题得到了解决。

有没有一种简单的方法可以让它指向它拥有的实际字段有问题吗?

当然不是。这需要对程序员的实际意图有直观的理解,而计算机目前还不能做到这一点。

你有一个插入像:

INSERT INTO MyTable (ColumnA, ColumnB, ... ColumnZ)
VALUES (ValueA, ValueC, ... ValueZ)

计算机不可能知道ColumnB应该得到ValueB而不是ValueC,因为程序员可能希望这样。因此,无法通过编程方式知道ValueB是缺失的值,或者ColumnB是"问题列"。

所以没有,没有捷径,对不起。

您可以做的一件事是将insert构造为:

insert into t(col1,
col2,
. . .
)
values (<whatever>,  -- col1
<whatever>,  -- col2
. . .
);

这对表达式进行排序。您可以通过将这两个列表粘贴到电子表格中并手动进行比较来发现问题。

或者,正如我更可能做的那样:

insert into t(col1,
col2,
. . .
)
select <whatever> as col1,
<whatever> as col2
. . .

当然,仅仅列出要插入的列就可以解决您的问题。

那么,我建议你重新坐一下。在一个表中插入数百列可能是个坏主意。可能有更好的方法来构建表格。

对于好奇的人来说,MySQL有一个有趣的、非标准的解决方案。它允许在insert中使用set,因此可以显式设置列值。

这不是SQL解决方案。但我可能会制作一个小程序,将字段映射到值,并从中确定问题所在。

检查我在JavaScript中的简单程序,该程序将字段映射到值。

相关内容

最新更新