使用共享标识主键在 table 中使用存储过程插入数据时出错
Error while inserting data with stored procedure in table with shared identity primary key
我有几个链接在一起的表,应该在其中插入数据以使用存储过程。这些表格是:
create table contactpersoon
(
contactpersoonnr integer identity(1,1),
klantnr integer,
naam varchar(50) not null,
telefoonnr varchar(10) not null,
emailadres varchar(50) not null,
constraint pk_contactpersoon
primary key(contactpersoonnr, klantnr),
constraint fk_contactpersoon_klantnr
foreign key(klantnr) references klant(klantnr)
)
create table klant
(
klantnr integer identity(1,1) primary key,
bedrijfsnaam varchar(50) not null
)
create table Logins
(
GebruikersNaam varchar(30),
Wachtwoord varchar(30),
Klantnr int,
MdwNr int,
constraint pk_logID primary key(GebruikersNaam),
constraint fk_klantnr foreign key(klantnr) references klant(klantnr),
constraint fk_mdwnr foreign key(mdwnr) references medewerker(mdwnr)
)
向这些表添加数据的存储过程:
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'spKlantAanmaken')
DROP PROCEDURE spKlantAanmaken
GO
Create Procedure spKlantAanmaken
(
@bedrijfsnaam as varchar(255),
@contactnaam as varchar(255),
@telnr as integer,
@email as varchar(255),
@gebruikersnaam as varchar(255),
@wachtwoord as varchar(255)
)
AS
Begin transaction
Declare @klantnr integer
Declare @contactpersoonnr integer
Insert into Klant Values (@klantnr, @bedrijfsnaam);
Insert into contactpersoon values(@contactpersoonnr, @klantnr, @contactnaam, @telnr, @email);
Insert into Logins values (@gebruikersnaam, @wachtwoord ,@klantnr, NULL);
Select * from contactpersoon
IF @@ERROR <> 0
BEGIN
ROLLBACK
RAISERROR ('Error tijdens uitvoeren van stap 2.', 16, 1)
RETURN
END
COMMIT
GO
我不知道是否有必要在插入中使用这些标识值。
如果我尝试这个存储过程,我会收到以下错误:
Msg 8101, Level 16, State 1, Procedure spKlantAanmaken, Line 923
An explicit value for the identity column in table 'Klant' can only be
specified when a column list is used and IDENTITY_INSERT is ON.
如果我从插入中删除标识值,我会收到此错误:
Msg 213, Level 16, State 1, Procedure spKlantAanmaken, Line 923
Column name or number of supplied values does not match table definition.
我做错了什么?
由于您有 identity
列,因此您 必须 在 INSERT
语句中指定要插入的列列表,并且 不提供标识列的值 - 像这样:
而不是
Insert into Klant Values (@klantnr, @bedrijfsnaam);
使用
Insert into Klant(bedrijfsnaam) Values (@bedrijfsnaam);
并为 所有 您的 INSERT
操作执行此操作。
这是普遍接受的 "Best Practice" 任何 时间你插入一些东西到 table - 建议 总是 明确指定要插入的 table 中的列列表(以避免恼人的错误和意外)。
在您的 SP 中编辑这两行
Insert into Klant (bedrijfsnaam)
Values (@bedrijfsnaam);
Insert into contactpersoon(klantnr,naam,telefoonnr,emailadres)
values(@klantnr, @contactnaam, @telnr, @email);
提供列列表,排除 insert
语句中的 identity
列
避免在 INSERT 查询中使用 identity
列 klantnr
、contactpersoonnr
并显式定义您的列名称:
因此以下代码适用于您的情况:
Insert into Klant(bedrijfsnaam) Values (@bedrijfsnaam);
Insert into contactpersoon(klantnr, naam, telefoonnr, emailadres) values(@klantnr, @contactnaam, @telnr, @email);
只需在 INSERT 语句中指定列名和内容,例如:
INSERT INTO klant (bedrijfsnaam) VALUES ('XYZ');
如果您不指定列名列表,SQL 解释器暗示您也需要标识列。在这种情况下,您可能希望为 2 列设置数据,但只提供一个内容元素,它解释了后一条错误消息。
当您使用 Identity
时,应用 identity
的列不需要在您的 INSERT
语句 VALUES
中。所以像下面这样编辑你的代码
编辑
您似乎还遗漏了要插入的列
Insert into Klant (bedrijfsnaam) Values (@bedrijfsnaam)
Insert into contactpersoon (klantnr, contactnaam, telnr, email) Values (@klantnr, @contactnaam, @telnr, @email)
似乎所有的答案都在说同样的话所以希望你的问题得到解决
我有几个链接在一起的表,应该在其中插入数据以使用存储过程。这些表格是:
create table contactpersoon
(
contactpersoonnr integer identity(1,1),
klantnr integer,
naam varchar(50) not null,
telefoonnr varchar(10) not null,
emailadres varchar(50) not null,
constraint pk_contactpersoon
primary key(contactpersoonnr, klantnr),
constraint fk_contactpersoon_klantnr
foreign key(klantnr) references klant(klantnr)
)
create table klant
(
klantnr integer identity(1,1) primary key,
bedrijfsnaam varchar(50) not null
)
create table Logins
(
GebruikersNaam varchar(30),
Wachtwoord varchar(30),
Klantnr int,
MdwNr int,
constraint pk_logID primary key(GebruikersNaam),
constraint fk_klantnr foreign key(klantnr) references klant(klantnr),
constraint fk_mdwnr foreign key(mdwnr) references medewerker(mdwnr)
)
向这些表添加数据的存储过程:
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'spKlantAanmaken')
DROP PROCEDURE spKlantAanmaken
GO
Create Procedure spKlantAanmaken
(
@bedrijfsnaam as varchar(255),
@contactnaam as varchar(255),
@telnr as integer,
@email as varchar(255),
@gebruikersnaam as varchar(255),
@wachtwoord as varchar(255)
)
AS
Begin transaction
Declare @klantnr integer
Declare @contactpersoonnr integer
Insert into Klant Values (@klantnr, @bedrijfsnaam);
Insert into contactpersoon values(@contactpersoonnr, @klantnr, @contactnaam, @telnr, @email);
Insert into Logins values (@gebruikersnaam, @wachtwoord ,@klantnr, NULL);
Select * from contactpersoon
IF @@ERROR <> 0
BEGIN
ROLLBACK
RAISERROR ('Error tijdens uitvoeren van stap 2.', 16, 1)
RETURN
END
COMMIT
GO
我不知道是否有必要在插入中使用这些标识值。 如果我尝试这个存储过程,我会收到以下错误:
Msg 8101, Level 16, State 1, Procedure spKlantAanmaken, Line 923
An explicit value for the identity column in table 'Klant' can only be specified when a column list is used and IDENTITY_INSERT is ON.
如果我从插入中删除标识值,我会收到此错误:
Msg 213, Level 16, State 1, Procedure spKlantAanmaken, Line 923
Column name or number of supplied values does not match table definition.
我做错了什么?
由于您有 identity
列,因此您 必须 在 INSERT
语句中指定要插入的列列表,并且 不提供标识列的值 - 像这样:
而不是
Insert into Klant Values (@klantnr, @bedrijfsnaam);
使用
Insert into Klant(bedrijfsnaam) Values (@bedrijfsnaam);
并为 所有 您的 INSERT
操作执行此操作。
这是普遍接受的 "Best Practice" 任何 时间你插入一些东西到 table - 建议 总是 明确指定要插入的 table 中的列列表(以避免恼人的错误和意外)。
在您的 SP 中编辑这两行
Insert into Klant (bedrijfsnaam)
Values (@bedrijfsnaam);
Insert into contactpersoon(klantnr,naam,telefoonnr,emailadres)
values(@klantnr, @contactnaam, @telnr, @email);
提供列列表,排除 insert
语句中的 identity
列
避免在 INSERT 查询中使用 identity
列 klantnr
、contactpersoonnr
并显式定义您的列名称:
因此以下代码适用于您的情况:
Insert into Klant(bedrijfsnaam) Values (@bedrijfsnaam);
Insert into contactpersoon(klantnr, naam, telefoonnr, emailadres) values(@klantnr, @contactnaam, @telnr, @email);
只需在 INSERT 语句中指定列名和内容,例如:
INSERT INTO klant (bedrijfsnaam) VALUES ('XYZ');
如果您不指定列名列表,SQL 解释器暗示您也需要标识列。在这种情况下,您可能希望为 2 列设置数据,但只提供一个内容元素,它解释了后一条错误消息。
当您使用 Identity
时,应用 identity
的列不需要在您的 INSERT
语句 VALUES
中。所以像下面这样编辑你的代码
编辑
您似乎还遗漏了要插入的列
Insert into Klant (bedrijfsnaam) Values (@bedrijfsnaam)
Insert into contactpersoon (klantnr, contactnaam, telnr, email) Values (@klantnr, @contactnaam, @telnr, @email)
似乎所有的答案都在说同样的话所以希望你的问题得到解决