存储过程中 table 值参数中的主键重复
Primary key duplicate in a table-valued parameter in stored procedure
我正在使用以下代码在我的 SP 中按 Table 值参数插入日期。实际上,当我的 TVP 中存在一条记录时它会起作用,但当它有多个记录时它会引发以下错误:
'违反主键约束'PK_ReceivedCash''。无法在对象 'Banking.ReceivedCash' 中插入重复键。声明已终止。
insert into banking.receivedcash(ReceivedCashID,Date,Time)
select (select isnull(Max(ReceivedCashID),0)+1 from Banking.ReceivedCash),t.Date,t.Time from @TVPCash as t
如果 @TVPCash
中有多于一行,您的查询确实有缺陷。检索最大值 ReceivedCashID
的查询是一个常量,然后用于 @TVPCash
中的每一行以插入到 Banking.ReceivedCash
.
我强烈建议寻找替代方案而不是这样做。多个用户可能 运行 此查询并检索相同的最大值。如果您坚持保持查询原样,请尝试 运行 执行以下操作:
insert into banking.receivedcash(
ReceivedCashID,
Date,
Time
)
select
(select isnull(Max(ReceivedCashID),0) from Banking.ReceivedCash)+
ROW_NUMBER() OVER(ORDER BY t.Date,t.Time),
t.Date,
t.Time
from
@TVPCash as t
这使用 ROW_NUMBER 来计算 @TVPCash
中的行号,并将其添加到 Banking.ReceivedCash
的最大值 ReceivedCashID
中。
我正在使用以下代码在我的 SP 中按 Table 值参数插入日期。实际上,当我的 TVP 中存在一条记录时它会起作用,但当它有多个记录时它会引发以下错误:
'违反主键约束'PK_ReceivedCash''。无法在对象 'Banking.ReceivedCash' 中插入重复键。声明已终止。
insert into banking.receivedcash(ReceivedCashID,Date,Time)
select (select isnull(Max(ReceivedCashID),0)+1 from Banking.ReceivedCash),t.Date,t.Time from @TVPCash as t
如果 @TVPCash
中有多于一行,您的查询确实有缺陷。检索最大值 ReceivedCashID
的查询是一个常量,然后用于 @TVPCash
中的每一行以插入到 Banking.ReceivedCash
.
我强烈建议寻找替代方案而不是这样做。多个用户可能 运行 此查询并检索相同的最大值。如果您坚持保持查询原样,请尝试 运行 执行以下操作:
insert into banking.receivedcash(
ReceivedCashID,
Date,
Time
)
select
(select isnull(Max(ReceivedCashID),0) from Banking.ReceivedCash)+
ROW_NUMBER() OVER(ORDER BY t.Date,t.Time),
t.Date,
t.Time
from
@TVPCash as t
这使用 ROW_NUMBER 来计算 @TVPCash
中的行号,并将其添加到 Banking.ReceivedCash
的最大值 ReceivedCashID
中。