【问题标题】:SQL Server - "Column name or number of supplied value does not match table definition"SQL Server - “列名或提供的值的数量与表定义不匹配”
【发布时间】:2017-10-10 13:31:32
【问题描述】:

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

我真的很想走捷径,我的表有数百列,我不想手动筛选代码,检查其字段定义的值。当我尝试运行它时,错误消息总是指向相同的行号——上面有 INSERT 的行。

有没有简单的方法让它指向它有问题的 actual 字段?

编辑:阅读给出的答案后,我意识到我根本不了解此消息的原因。这只是缺少字段的结果,根本与不正确的数据类型有关。当我添加缺少的字段时,即使某些字段中的数据类型仍然错误,错误也消失了。

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

【问题讨论】:

  • SQL Server Management Studio 中的 Intellisense 将突出显示无效的列名
  • 这完全取决于你的INSERT 声明是什么。如果您将其添加到您的问题中会有所帮助hint hint nudge nudge
  • @JamiePollard 我有 2 个问题,1)intellisense 突出显示一切,因为它是一个链接服务器,2)字段名称很好(对于大多数人来说),但我(大部分)把字段中的数据类型错误。
  • 你的问题的症结就在这里,“我的表有数百列”。这是一个巨大的危险信号,表明设计可能不是最优的。
  • @SeanLange 我的表有数百列有很好的理由。我不是业余爱好者。

标签: sql sql-server


【解决方案1】:

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

当然不是。这需要对程序员的实际意图有一个直观的了解,而计算机目前不具备这种能力。

你有这样的插入:

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

计算机不可能知道 ColumnB 应该得到 ValueB 而不是 ValueC,因为也许程序员想要那样做。因此,无法以编程方式知道 ValueB 是缺失的值,或者 ColumnB 是“问题列”。

所以不,没有捷径,抱歉。

【讨论】:

  • 我明白你在说什么,但是当我尝试将“abc”加载到一个名为“AccountBalance”的数字字段时,它显然会出错,所以它为什么不能告诉我“ AccountBalance”是它失败的地方...?
  • Tab 已经说过,sql 引擎怎么会知道这是问题所在?当数据类型不匹配时,就会发生隐式转换。如果每次发生这种情况时它都会举手,那么当代码的作者希望发生这种情况时将具有挑战性。
  • 有时解析器不会直接指向错误所在的位置,但通常错误接近它所指向的位置。在第 17 行说是解析器指出错误的地方,而实际上它在第 13 行。但在你的情况下,这可能会很困难,因为它是一个大字符串,我猜。
  • @edper 这就是我通常发现的,但在这种情况下,所有错误都指向 INSERT 所在的行。
  • 我认为你没有抓住重点。它怎么会知道在第 10 列(例如)您没有提供值?错误信息是列数和值的个数不一样。查询引擎如何知道您没有为哪一列提供值?
【解决方案2】:

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

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

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

或者,我更有可能这样做:

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

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

那么,我建议您重新访问您的餐桌。在进行此类插入的表中有数百列可能不是一个好主意。可能有更好的方法来构建表格。

对于好奇的人,MySQL 有一个有趣的、非标准的解决方案。它允许setinsert 中,因此您可以显式设置列值。

【讨论】:

  • 查询太大而无法改变它的工作方式,有这么多列是有很好的理由的。它正在使用 SELECT INTO 将输出写入表,并且效果很好,我只想将其更改为写入几乎相同的表,其中某些列的定义不同。没有重新设计表或重写查询的余地。
【解决方案3】:

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

JavaScript 中检查我的简单程序,这将是map-field-to-values

【讨论】:

  • 我喜欢这个!谢谢你的回答!
  • 不客气@Lefty。但是您是否尝试将您的SQL 命令字符串放在我的程序中并运行它?如果不尝试,看看它是否有效,或者您是否也可以在 Google 文档 上发布您的 SQL 命令的整个字符串,然后分享链接。
  • 不,我还没有尝试过,因为在您发布此内容时,我已经设法“手动”解决了这个问题,但我会在某个时候尝试一下,并且几乎肯定会在未来。我不能真正将 SQL 放入“公共领域”,因为它是我公司的财产,不幸的是,它的大小需要很长时间才能混淆它。
  • @Lefty 很高兴听到您终于解决了它!恭喜!这就是此时重要的事情!我完全理解不要将 SQL 命令公之于众。这对我来说没有问题。
猜你喜欢
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
相关资源
最近更新 更多