错误:列名或提供的值数量与表定义不匹配
本文关键字:不匹配 定义 错误 | 更新日期: 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
- 我尝试使用这个表类型来创建一个过程:Update_People
CREATE TYPE [dbo].[PeopleType] AS TABLE(
[ID] [varchar](10) NOT NULL,
[Name][varchar](50) NULL,
[Email][varchar](50) NULL
)
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);