SQL Server - 消息213 - 插入错误:列名或提供的值数与表定义不匹配

时间:2010-08-21 20:36:01

标签: sql-server

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

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link

我收到以下错误:

  

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

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

感谢您的帮助。我已经尝试将此帖子发布到sqlsvrtip,但我没有得到回应,所以我会尝试在这里尝试更多的活动。

3 个答案:

答案 0 :(得分:2)

其中一列是IDENTITY列吗?

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

答案 1 :(得分:1)

请你在数据库中运行这个语句并给我们输出??

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(真)?
  • 是否有任何列is_computed设为1(真)?
  • 是否有任何类型为timestamprowversion ??
  • 的列

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

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

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

使用这种方法,您可以省去任何无法轻易插入的列...

答案 2 :(得分:0)

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

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

DROP TABLE tblTable1 -- assuming there are no FKs

select * INTO tblTable1 from tblTable1_Link
--  Then Re-create keys / indexes

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