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

问题描述 投票:0回答:17

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

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link

我收到以下错误:

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

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

sql sql-server sql-server-2005 tsql
17个回答
56
投票

他们没有相同的结构...我可以保证他们是不同的

我知道你已经创建了它... 数据库中已经有一个名为“tbltable1”的对象

你可能想要的是这个(这也解决了你的其他问题):

Drop table tblTable1

select * into tblTable1 from tblTable1_Link

31
投票

我还想提一下,如果你有类似的东西

insert into blah
       select * from blah2

和 blah 和 blah2 是相同的请记住,计算列将抛出同样的错误......

我刚刚意识到当上述失败时我尝试了

insert into blah (cola, colb, colc)
       select cola, colb, colc from blah2

在我的示例中,它是全名字段(从名字和姓氏等计算)


23
投票

对于插入,最好指定列名,请参见以下内容

DECLARE @Table TABLE(
        Val1 VARCHAR(MAX)
)

INSERT INTO @Table SELECT '1'

工作正常,将表 def 更改为导致错误

DECLARE @Table TABLE(
        Val1 VARCHAR(MAX),
        Val2 VARCHAR(MAX)
)

INSERT INTO @Table SELECT '1'

消息 213,级别 16,状态 1,第 6 行 插入错误:列名或列数 提供的值与表不匹配 定义。

但是把上面的改成

DECLARE @Table TABLE(
        Val1 VARCHAR(MAX),
        Val2 VARCHAR(MAX)
)

INSERT INTO @Table (Val1)  SELECT '1'

有效。您需要更具体地指定列

提供结构,我们可以看看


12
投票

问题是您试图在不使用列的情况下将数据插入数据库。 SQL 服务器给你那个错误信息。

错误:

insert into users values('1', '2','3')
- 只要你只有 3 列就可以正常工作

如果你有 4 列,但只想插入其中的 3 列

正确:

insert into users (firstName,lastName,city) values ('Tom', 'Jones', 'Miami')


5
投票

谨防触发器。也许问题出在插入行的触发器中的某些操作。


2
投票

删除表对我来说不是一个选项,因为我正在保留一个运行日志。如果每次我需要插入时都必须删除,那么该表将毫无意义。

我的错误是因为我在创建表语句中有几列是其他列的产物,更改这些列解决了我的问题。例如

create table foo (
field1 as int
,field2 as int
,field12 as field1 + field2 )

create table copyOfFoo (
field1 as int
,field2 as int
,field12 as field1 + field2)  --this is the problem, should just be 'as int'

insert into copyOfFoo
SELECT * FROM foo

1
投票

计算列会产生问题。 不要使用

SELECT *
。您必须在 SELECT 之后指定每个字段,计算字段除外


1
投票

此问题的一些来源如下

1-身份列,

2- 计算列

3-不同的结构

所以检查那三个,我发现我的问题是第二个,


0
投票

对我来说,罪魁祸首是分配给薪水的整数值

插入 Employees(ID,FirstName,LastName,Gender,Salary) values(3,'Canada', 'pa', 'm',15,000)

在薪水列中当我们分配 15,000 时,编译器理解 15 和 000。

这个更正对我来说很好。 插入 Employees(ID,FirstName,LastName,Gender,Salary) values(4,'US', 'sam', 'm',15000)


0
投票

更新到 SQL Server 2016/2017/…
我们有一些存储过程来导入和导出数据库。
在 sp 中,我们使用(除其他外)RESTORE FILELISTONLY FROM DISK 我们创建了一个 用于从文件还原的表“#restoretemp”。

使用 SQL Server 2016,MS 添加了一个字段 SnapshotURL nvarchar(360)(恢复 URL Azure)是什么导致了错误消息。
在我增强了附加字段之后,恢复又成功了。
代码剪断(见最后一个字段):

 SET @query = 'RESTORE FILELISTONLY FROM DISK = ' + QUOTENAME(@BackupFile , '''')
CREATE TABLE #restoretemp
(
LogicalName nvarchar(128)
,PhysicalName nvarchar(128)
,[Type] char(1)
,FileGroupName nvarchar(128)
,[Size] numeric(20,0)
,[MaxSize] numeric(20,0)
,FileID bigint
,CreateLSN numeric(25,0)
,DropLSN numeric(25,0) NULL
,UniqueID uniqueidentifier
,ReadOnlyLSN numeric(25,0)
,ReadWriteLSN numeric(25,0)
,BackupSizeInByte bigint
,SourceBlockSize int
,FilegroupID int
,LogGroupGUID uniqueidentifier NULL
,DifferentialBaseLSN numeric(25,0)
,DifferentialbaseGUID uniqueidentifier
,IsReadOnly bit
,IsPresent bit
,TDEThumbprint varbinary(32)
-- Added field 01.10.2018 needed from SQL Server 2016 (Azure URL)
,SnapshotURL nvarchar(360)
)

INSERT #restoretemp EXEC (@query)
SET @errorstat = @@ERROR
if @errorstat <> 0 
Begin
if @Rueckgabe = 0 SET @Rueckgabe = 6
End
Print @Rueckgabe

0
投票

检查你的

id
。是身份吗?如果是,则确保将其声明为
ID not null Identity(1,1)

在创建表格之前,

Drop table
然后是
create table
.


0
投票

导致此错误的问题是我试图将空值插入 NOT NULL 列。


0
投票

我有同样的问题,我解决它的方法可能不是最好的,但它现在正在工作。

它涉及创建链接服务器和使用动态 sql - 不是最好的,但如果有人能提出更好的建议,请评论/回答。

declare @sql nvarchar(max)


DECLARE @DB_SPACE TABLE (
[DatabaseName] NVARCHAR(128) NOT NULL,
[FILEID] [smallint] NOT NULL,
[FILE_SIZE_MB] INT NOT NULL DEFAULT (0),
[SPACE_USED_MB] INT NULL DEFAULT (0),
[FREE_SPACE_MB] INT NULL DEFAULT (0),
[LOGICALNAME] SYSNAME NOT NULL,
[DRIVE] NCHAR(1) NOT NULL,
[FILENAME] NVARCHAR(260) NOT NULL,
[FILE_TYPE] NVARCHAR(260) NOT NULL,
[THE_AUTOGROWTH_IN_KB] INT NOT NULL DEFAULT(0)
,filegroup VARCHAR(128)
,maxsize VARCHAR(25)

PRIMARY KEY CLUSTERED ([DatabaseName] ,[FILEID] )
)  


SELECT @SQL ='SELECT [DatabaseName],
        [FILEID],
        [FILE_SIZE_MB],
        [SPACE_USED_MB],
        [FREE_SPACE_MB],
        [LOGICALNAME],
        [DRIVE],
        [FILENAME],
        [FILE_TYPE],
        [THE_AUTOGROWTH_IN_KB]
        ,filegroup
        ,maxsize FROM OPENQUERY('+ QUOTENAME('THE_MONITOR') + ','''+ ' EXEC MASTER.DBO.monitoring_database_details '  +''')'
exec sp_executesql @sql


      INSERT INTO @DB_SPACE(
                            [DatabaseName],
                            [FILEID],
                            [FILE_SIZE_MB],
                            [SPACE_USED_MB],
                            [FREE_SPACE_MB],
                            [LOGICALNAME],
                            [DRIVE],
                            [FILENAME],
                            [FILE_TYPE],
                            THE_AUTOGROWTH_IN_KB,
                            [filegroup],
                            maxsize
                          )

      EXEC SP_EXECUTESQL @SQL

这对我有用。 我可以保证存储过程返回的列数和列类型与此表中的相同,只是因为我从存储过程中返回了同一个表。


0
投票

就我而言,我有:

insert into table1 one
select * from same_schema_as_table1 same_schema
left join...

我不得不将

select *
更改为
select same_schema.*


0
投票

您在插入查询中的 TableName 之后缺少列名:

INSERT INTO TableName**(Col_1,Col_2,Col_3)** VALUES(val_1,val_2,val_3)

0
投票

在我的例子中,问题是我正在执行的 SP 返回了两个结果集,只有第二个结果集与表定义匹配。


0
投票

虽然其他答案可以很好地用于插入目的,但您也可以运行以下命令:

IF OBJECT_ID('tempdb..@table) IS NOT NULL
    DROP TABLE @table. 
Then go back and rerun 

DECLARE @Table TABLE(        
 Val1 VARCHAR(MAX),
 Val2 VARCHAR(MAX) )  
INSERT INTO @Table SELECT '1' . 

它应该工作。

© www.soinside.com 2019 - 2024. All rights reserved.