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不客氣 –