【问题标题】:SQL server - Msg 213 - Insert Error: Column name or number of supplied values does not match table definitionSQL 服务器 - 消息 213 - 插入错误:列名或提供的值的数量与表定义不匹配
【发布时间】:2010-08-21 20:36:01
【问题描述】:

在 SQL Server 中,我尝试使用以下查询将值从一个表插入到另一个表:

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link

我收到以下错误:

提供的列名或数量 值与表不匹配 定义。

我确信这两个表具有相同的结构、列名和相同的数据类型。

感谢您的帮助。我已尝试将其发布到 sqlsvrtip,但没有收到任何回复,所以我想在这里尝试一下,似乎还有更多活动。

【问题讨论】:

  • 如果您发布代码或 XML,在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮 (101 010) 以很好地格式化和语法高亮!

标签: sql-server


【解决方案1】:

其中一列是 IDENTITY 列吗?

SET IDENTITY_INSERT tblTable1 ON
insert into tblTable1 select * from tblTable1_Link
SET IDENTITY_INSERT tblTable1 OFF

【讨论】:

    【解决方案2】:

    您能否在您的数据库中运行此语句并将输出结果提供给我们?

    SELECT 
        c.name,
        c.is_identity,
        c.is_computed, 
        t.name 'Type name'
    FROM sys.columns c
    INNER JOIN sys.types t ON c.user_type_id = t.user_type_id
    WHERE object_id = object_ID('tblTable1')
    

    问题:

    • 是否有任何列将is_identity 设置为 1 (true)?
    • 是否有任何列将is_computed 设置为 1 (true)?
    • 是否有任何类型为timestamprowversion 的列??

    如果您有任何这些列:您无法在INSERT 语句中轻松设置任何这些列。您可以通过一些额外的工作来设置标识列,但是在任何情况下都不能设置计算列或 TIMESTAMP / ROWVERSION 类型的列不能

    这就是为什么我建议始终明确指定列列表 - 即使您需要所有列:

    INSERT INTO dbo.tblTable1(col1, col2, ...., colX)
       SELECT col1, col2, ...., colX FROM dbo.tblTable1_Link
    

    通过这种方法,您可以省去任何不能很容易插入的列...

    【讨论】:

      【解决方案3】:

      @Fosco +1,因为这很可能是答案。

      请注意,如果您只是缓存链接表并因此每次都清空它,那么您可以执行以下操作:

      DROP TABLE tblTable1 -- assuming there are no FKs
      
      select * INTO tblTable1 from tblTable1_Link
      --  Then Re-create keys / indexes
      

      这意味着如果 tblTable1_Link 的架构发生更改,那么该更改也将在目标表中。

      【讨论】:

        猜你喜欢
        • 2014-06-14
        • 1970-01-01
        • 1970-01-01
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 2022-09-28
        • 2016-04-17
        • 1970-01-01
        相关资源
        最近更新 更多