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

Sql 提供的值的列名或数目与表定义不匹配,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,在SQL server中,我尝试使用以下查询将值从一个表插入到另一个表: delete from tblTable1 insert into tblTable1 select * from tblTable1_Link 我得到以下错误: 提供的值的列名或数目与表定义不匹配 我确信这两个表具有相同的结构、相同的列名和相同的数据类型 请帮忙 它们的结构不同。。。我可以保证他们是不同的 我知道你已经创造了它 您可能需要这样做(这也解决了您的其他问题): 对于插入,最好指定列名,请参见以下内容 DE

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

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link
我得到以下错误:

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

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


请帮忙

它们的结构不同。。。我可以保证他们是不同的

我知道你已经创造了它

您可能需要这样做(这也解决了您的其他问题):


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

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,16级,状态1,第6行 插入错误:列名或列数 提供的值与表不匹配 定义

但将上述内容更改为

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

INSERT INTO @Table (Val1)  SELECT '1'
工作。您需要更具体地指定列


提供结构,我们就可以看一看了

删除表对我来说不是一个选项,因为我保存了一个运行日志。如果每次我需要插入时都不得不放下,那么这个表就没有意义了

我的错误是因为CREATETABLE语句中有两列是其他列的产物,更改这些列修复了我的问题。乙二醇

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

这是一篇比较老的帖子,但我想说的是,如果你有

insert into blah
       select * from blah2
blah和blah2是相同的请记住,计算列将抛出相同的错误

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

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

在我的示例中,它是全名字段(从第一个和最后一个字段开始计算,等等)

问题出在计算列上。
不要使用
选择*
。您必须在选择后指定每个字段(计算字段除外)

我希望您找到了一个好的解决方案。 我也有同样的问题,我解决这个问题的方式可能不是最好的,但它现在正在发挥作用

这涉及到创建链接服务器和使用动态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
这是我现在的工作。 我可以保证存储过程返回的列数和列类型与此表中的列数和列类型相同,这仅仅是因为我从存储过程返回了相同的表

谢谢和问候
marcelo

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

错误:
插入用户值('1'、'2'、'3')
-只要您只有3列,就可以了

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

正确:
将值('Tom'、'Jones'、'Miami')插入用户(firstName、lastName、city)


希望这对我有帮助。罪魁祸首是分配给薪水的整数

在员工(ID、名、姓、性别、工资)中插入值(3、‘加拿大’、‘pa’、‘m’、15000)

在工资栏中,当我们分配15000时,编译器理解15和000

这个修正对我来说很好。
将值(4,'US','sam','m',15000)插入员工(ID,名字,姓氏,性别,薪水)

检查您的
ID
。是身份吗?如果是,则确保声明为
ID非空标识(1,1)


在创建表之前,
删除表
,然后
创建表

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

在SQL server 2016中,MS添加了一个字段快照url 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
SET@query='RESTORE FILELISTONLY FROM DISK='+QUOTENAME(@BackupFile,'')
创建表#restoretemp
(
逻辑名称nvarchar(128)
,PhysicalName nvarchar(128)
,[Type]字符(1)
,FileGroupName nvarchar(128)
,[Size]数字(20,0)
,[MaxSize]数字(20,0)
,FileID bigint
,CreateLSN数字(25,0)
,数字(25,0)NULL
,唯一标识符,唯一标识符
,只读序列号数字(25,0)
,ReadWriteLSN数字(25,0)
,BackupSizeInByte bigint
,SourceBlockSize int
,FilegroupID int
,LogGroupGUID uniqueidentifier NULL
,DifferentialsBaselSN数字(25,0)
,BaseGuid唯一标识符
,是只读位
,i当前位
,TDEThumbprint varbinary(32)
--从SQL Server 2016中添加字段01.10.2018(Azure URL)
,快照URL nvarchar(360)
)
插入#restoretemp EXEC(@query)
设置@errorstat=@@ERROR
如果@errorstat 0
开始
如果@Rueckgabe=0,则设置@Rueckgabe=6
终点
打印@Rueckgabe

小心触发器。可能问题在于触发器中插入行的某些操作。

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

此问题的一些来源如下所示

1-身份栏

2-计算列

3-不同的结构


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

还有一种可能性是,临时数据库上的数据库排序规则与插入的数据库不匹配。不发布表的架构不是很容易标记吗?“我敢肯定”是不够的:我们都经历了足够多的情况,在这些情况下,我们看不到树木,知道我们自己的确定性可能是非常不正确的,并且需要发布适当数量的关于问题的信息,让其他人指出我们缺少的明显的东西。你还应该看看所有的触发因素。如果你有一个写得不好的触发器插入审计表之类的东西,你会得到完全相同的消息。我的问题不是inse
 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