存储过程中 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 中。