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

时间:2009-07-20 11:07:27

标签: sql sql-server sql-server-2005 tsql

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

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link

我收到以下错误:

  

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

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

请帮忙!

14 个答案:

答案 0 :(得分:35)

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

我知道你已经创建了它...... There is already an object named ‘tbltable1’ in the database

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

Drop table tblTable1

select * into tblTable1 from tblTable1_Link

答案 1 :(得分:18)

对于插入,最好指定列名,请参阅以下

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'
  

Msg 213,Level 16,State 1,Line 6   插入错误:列名或数字   提供的值与表不匹配   定义

但将上述内容改为

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

INSERT INTO @Table (Val1)  SELECT '1'

的工作原理。您需要更具体地指定列

提供结构,我们可以看看

答案 2 :(得分:14)

这是一篇较旧的帖子,但我还想提一下,如果你有类似

的话
insert into blah
       select * from blah2

和blah和blah2完全相同,请记住计算列会抛出同样的错误......

我刚刚意识到,当上述失败并且我尝试了

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

在我的例子中,它是fullname字段(从第一个和最后一个计算,等等)

答案 3 :(得分:9)

问题是您尝试在不使用列的情况下将数据插入数据库。 Sql server为您提供该错误消息。

错误:insert into users values('1', '2','3') - 只要您只有3列

,这就可以正常工作

如果您有4列但只想插入3列

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

希望这会有所帮助

答案 4 :(得分:2)

删除表格对我来说不是一个选项,因为我保留了一个正在运行的日志。如果每次我需要插入我不得不放下,那桌子将毫无意义。

我的错误是因为我在create table语句中有几列是其他列的产品,更改这些列修复了我的问题。例如

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

答案 5 :(得分:0)

列前缀与查询中使用的表名或别名不匹配。

我也在努力解决这个错误

Nw我发现为什么只需要在查询中进行小的更改

http://sqlerrormessages.blogspot.com/2009/08/sql-server-error-messages-msg-107.html

答案 6 :(得分:0)

计算列会产生问题。 不要使用SELECT *。您必须在SELECT之后指定除计算字段

之外的每个字段

答案 7 :(得分: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

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

感谢和问候 马塞洛

答案 8 :(得分:0)

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

插入员工(ID,FirstName,LastName,Gender,Salary)值(3,'加拿大','pa','m',15,000)

工资栏中的

当我们分配15,000时,编译器会理解15和000。

此修正对我来说很好。 插入员工(ID,FirstName,LastName,Gender,Salary)值(4,'US','sam','m',15000)

答案 9 :(得分:0)

检查你的id是否为Identity,如果是,则确保ID不为null Identity(1,1) 在创建表之前,先删除表然后再创建表.. 2天后我解决了这个问题..

答案 10 :(得分:0)

更新到SQL Server 2016/2017 /…
我们有一些存储过程来导入和导出数据库。
在sp中,我们(除其他事项外)使用DISK RESTORE FILELISTONLY从磁盘创建一个 从文件还原的表“ #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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

导致此错误的问题是我试图将空值插入到非空列中。

答案 13 :(得分:0)

这个问题的一些来源如下

1- 标识列 ,

2- 计算列

3-不同的结构

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