【问题标题】:Column name or number of supplied values does not match table definition列名或提供的值的数量与表定义不匹配
【发布时间】:2010-11-12 06:46:01
【问题描述】:

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

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link

我收到以下错误:

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

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

【问题讨论】:

  • 另一种可能是您的 TEMP 数据库上的数据库排序规则与您插入的数据库不匹配。
  • 这不是因为不发布表的模式而高度标记吗? “我确定”是不够的:我们都经历过很多看不见树林的情况,以至于我们知道我们自己的确定性可能是非常错误的,并且需要发布适当数量的关于让其他人指出我们遗漏的明显东西的问题。
  • 您还应该查看所有触发器。如果您将编写错误的触发器插入到审计表之类的内容中,您将收到完全相同的消息。

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


【解决方案1】:

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

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

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

Drop table tblTable1

select * into tblTable1 from tblTable1_Link

【讨论】:

    【解决方案2】:

    对于插入,最好指定列名,见下文

    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'
    

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

    提供结构,我们可以看看

    【讨论】:

      【解决方案3】:

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

      我的错误是因为我在 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
      

      【讨论】:

        【解决方案4】:

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

        insert into blah
               select * from blah2
        

        并且 blah 和 blah2 是相同的,记住计算列会抛出同样的错误...

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

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

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

        【讨论】:

        • 为我工作。我的问题不是在没有明确说明列名的情况下插入,而是当我尝试加入两个不是这样创建的表时。一旦我添加了列名,我的加入就起作用了。一定是那个计算列搞砸了!
        • 感谢计算列问题,我可以确认这是真的。我有一张表,其列数完全相同,顺序相同。唯一的区别是源表使用计算列。
        • 我想我刚刚使用 SELECT INTO 并添加了两个 ROW_NUMBER() 列(分区不同)。它也来自表值函数:/
        【解决方案5】:

        计算列会造成问题。 不要使用SELECT *。您必须在 SELECT 之后指定除计算字段之外的每个字段

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题,我的解决方法可能不是最好的,但现在可以了。

          它涉及创建链接服务器和使用动态 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
          

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

          【讨论】:

            【解决方案7】:

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

            错误:insert into users values('1', '2','3') - 只要您只有 3 列,它就可以正常工作

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

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

            【讨论】:

              【解决方案8】:

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

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

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

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

              【讨论】:

                【解决方案9】:

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

                在创建表之前,Drop table 然后create table

                【讨论】:

                  【解决方案10】:

                  更新到 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
                  

                  【讨论】:

                  • 我知道这个答案不是最初的人要求的,但它确实帮助了我。所以谢谢。
                  【解决方案11】:

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

                  【讨论】:

                    【解决方案12】:

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

                    【讨论】:

                      【解决方案13】:

                      此问题的一些来源如下

                      1- 身份列,

                      2- 计算列

                      3-不同的结构

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

                      【讨论】:

                        猜你喜欢
                        • 2018-12-24
                        • 2021-11-06
                        • 1970-01-01
                        • 2014-05-27
                        • 1970-01-01
                        • 2018-11-24
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多