SQL Server-“SQL Server”;提供的值的列名或编号与表定义不匹配;

SQL Server-“SQL Server”;提供的值的列名或编号与表定义不匹配;,sql,sql-server,Sql,Sql Server,我知道在过去有很多问题可以解决这个问题,我理解为什么我会犯这个错误 我真的想要一个快捷方式,我的表有数百列,我不想手动筛选代码,根据字段定义检查值。当我试图运行它时,错误消息总是指向同一行号——上面有插入的行 有没有一个简单的方法让它指向它有问题的实际领域 编辑:在阅读了给出的答案后,我意识到我根本不理解这条消息的原因。这只是缺少字段的结果,与不正确的数据类型完全无关。当我添加缺少的字段时,错误消失了,即使某些字段中的数据类型仍然错误 幸运的是,答案和评论理解了问题的实际原因,而不是我对问题的评

我知道在过去有很多问题可以解决这个问题,我理解为什么我会犯这个错误

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

有没有一个简单的方法让它指向它有问题的实际领域

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

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

有没有一个简单的方法让它指向它的实际字段 有什么问题吗

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

您有一个类似以下内容的插入:

INSERT INTO MyTable (ColumnA, ColumnB, ... ColumnZ)
VALUES (ValueA, ValueC, ... ValueZ)
计算机不可能知道ColumnB应该得到ValueB而不是ValueC,因为可能程序员希望这样。因此,无法通过编程方式知道ValueB是缺少的值,或者ColumnB是“问题列”

所以,对不起,没有捷径

有没有一个简单的方法让它指向它的实际字段 有什么问题吗

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

您有一个类似以下内容的插入:

INSERT INTO MyTable (ColumnA, ColumnB, ... ColumnZ)
VALUES (ValueA, ValueC, ... ValueZ)
计算机不可能知道ColumnB应该得到ValueB而不是ValueC,因为可能程序员希望这样。因此,无法通过编程方式知道ValueB是缺少的值,或者ColumnB是“问题列”


因此,对不起,没有快捷方式。

您可以做的一件事是将插入的
结构为:

insert into t(col1,
              col2,
              . . .
             )
    values (<whatever>,  -- col1
            <whatever>,  -- col2
            . . .
           );
插入到t(col1,
col2,
. . .
)
值(,--col1
,--col2
. . .
);
这是表达的顺序。您可以通过将两个列表粘贴到电子表格中并手动比较来发现问题

或者,我更愿意这样做:

insert into t(col1,
              col2,
              . . .
             )
    select <whatever> as col1,
           <whatever> as col2
            . . .
插入到t(col1,
col2,
. . .
)
选择为col1,
作为col2
. . .
当然,仅仅列出插入的列就可以解决问题

那么,我建议你再去看看你的桌子。在一个表中有数百列包含这样的插入可能是个坏主意。也许有更好的方法来组织表格


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

您可以做的一件事是将
插入的结构设置为:

insert into t(col1,
              col2,
              . . .
             )
    values (<whatever>,  -- col1
            <whatever>,  -- col2
            . . .
           );
插入到t(col1,
col2,
. . .
)
值(,--col1
,--col2
. . .
);
这是表达的顺序。您可以通过将两个列表粘贴到电子表格中并手动比较来发现问题

或者,我更愿意这样做:

insert into t(col1,
              col2,
              . . .
             )
    select <whatever> as col1,
           <whatever> as col2
            . . .
插入到t(col1,
col2,
. . .
)
选择为col1,
作为col2
. . .
当然,仅仅列出插入的列就可以解决问题

那么,我建议你再去看看你的桌子。在一个表中有数百列包含这样的插入可能是个坏主意。也许有更好的方法来组织表格


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

这不是
SQL
解决方案。但我可能会制作一个小程序,将字段映射到值,然后从中确定错误


请在
JavaScript
中检查我的简单程序,这样做是正确的。

这不是
SQL
解决方案。但我可能会制作一个小程序,将字段映射到值,然后从中确定错误


请在
JavaScript
中检查我的简单程序。SQL Server Management Studio中的Intellisense将突出显示无效的列名,这完全取决于
INSERT
语句的内容。如果您将其添加到问题提示轻推中,则会有所帮助nudge@JamiePollard我有两个问题,1)intellisense突出显示所有内容,因为它是一个链接服务器,2)字段名很好(对于大多数服务器),但我(大部分)在字段中输入了错误的数据类型。问题的关键就在这里,“我的表有数百列“。这是一个巨大的危险信号,表明设计可能不够理想。@SeanLange我的表有数百列的原因非常充分。我不是业余爱好者。SQL Server Management Studio中的Intellisense将突出显示无效的列名,这完全取决于
INSERT
语句的内容。如果您将其添加到问题提示轻推中,则会有所帮助nudge@JamiePollard我有两个问题,1)intellisense突出显示所有内容,因为它是一个链接服务器,2)字段名很好(对于大多数服务器),但我(大部分)在字段中输入了错误的数据类型。问题的关键就在这里,“我的桌子有数百列”,这是一个巨大的危险信号,表明设计可能更少