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

本文关键字:不匹配 定义 错误 | 更新日期: 2023-09-27 18:13:13

我尝试了以下解决方案,试图做插入/更新数据表到sql server,但发生了一些问题。http://www.aspsnippets.com/Articles/SqlBulkCopy--Bulk-Insert-records-and-Update-existing-rows-if-record-exists-using-C-and-VBNet.aspx

    我创建了一个表:People
CREATE TABLE [dbo].[People](
  [ID] [varchar](10) NOT NULL,
  [Name] [varchar](50) NULL,
  [Email] [varchar](50) NULL,
  [Country] [varchar](50) NULL
) ON [PRIMARY]
  • 创建一个用户定义的表类型:PeopleType
  • CREATE TYPE [dbo].[PeopleType] AS TABLE(
      [ID] [varchar](10) NOT NULL,
      [Name][varchar](50) NULL,
      [Email][varchar](50) NULL
    )
    
  • 我尝试使用这个表类型来创建一个过程:Update_People
  • CREATE PROCEDURE [dbo].[Update_People]
          @tblpeople PeopleType READONLY
        AS
        BEGIN
          SET NOCOUNT ON;
          MERGE INTO People p1
          USING @tblpeople p2
          ON p1.ID=p2.ID
          WHEN MATCHED THEN
          UPDATE SET p1.Name = p2.Name
                ,p1.Email = p2.Email
          WHEN NOT MATCHED THEN
          INSERT VALUES(p2.ID, p2.Name, p2.Email);
        END
    

    但是当我尝试使用用户定义的表类型来创建过程时,发生了SQL server错误。

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

    我做错了什么或错过了什么?

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

    如果您不想添加国家,请更改您的Insert语句:

    INSERT INTO People(Id, Email, Name) VALUES(p2.ID, p2.Name, p2.Email);
    

    收到错误的原因是您没有指定要使用哪些列——Insert语句期望4,因为表中定义了4。但你只提供了3.

    另一种选择是将Country属性添加到用户定义的类型中,并使用以下过程添加国家:

    CREATE TYPE [dbo].[PeopleType] AS TABLE(
      [ID] [varchar](10) NOT NULL,
      [Name][varchar](50) NULL,
      [Email][varchar](50) NULL,
      [Country][varchar](50) NULL
    )
    INSERT VALUES(p2.ID, p2.Name, p2.Email, p2.Country);
    

    EDIT:我不确定语法,因为我有一段时间没有使用它了,但它可能是你只需要提供这样的列名:

    INSERT (Id, Email, Name) VALUES(p2.ID, p2.Name, p2.Email);