【问题标题】:Primary key duplicate in a table-valued parameter in stored procedure存储过程中表值参数中的主键重复
【发布时间】:2015-12-21 09:50:07
【问题描述】:

我正在使用以下代码在我的 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

【问题讨论】:

  • Banking.ReceivedCash 上有一个 PRIMARY 键,而您通过插入具有完全相同键的行来违反它。解决方案:不要插入具有相同键的行,或更改您的键,因为它不是正确的键。
  • @TT。实际上,我尝试通过此代码插入唯一值,如您所见(从 Banking.ReceivedCash 中选择 isnull(Max(ReceivedCashID),0)+1),但是当要插入多个记录时它不起作用!
  • ReceivedCashID 改为IDENTITY 列。
  • @TT。要求只是没有自动增量的主键

标签: sql-server-2008-r2 primary-key table-valued-parameters


【解决方案1】:

如果@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 中的行号,并将其添加到ReceivedCashID 的最大ReceivedCashID 中。

【讨论】:

    猜你喜欢
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多