1

我正在使用以下代码在表SP中插入日期值参数。实际上,当我的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 
+1

“Banking.ReceivedCash”上有一个PRIMARY键,并且您通过插入一个具有完全相同键的行来违反它。解决方案:不要插入具有相同密钥的行,或者更改密钥,因为它不是正确的密钥。 –

+0

@TT。实际上我尝试通过此代码插入唯一值,如您所见 (从Banking.ReceivedCash中选择isnull(Max(ReceivedCashID),0)+1)但是当插入多条记录时它不起作用! –

+0

改为使'ReceivedCashID'成为[IDENTITY](https://msdn.microsoft.com/en-us/library/ms186775%28v=sql.105%29.aspx)列。 –

回答

2

如果@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

+0

不错,完成它的作品伟大。 –

+0

@franchescototti不客气 –