【问题标题】:How to prevent duplicate update in sql stored procedure如何防止sql存储过程中的重复更新
【发布时间】:2017-01-30 11:10:59
【问题描述】:

我在 Sql 和我的项目的插入 Form 中有这张表,我阻止用户为相同的 HNumber 输入相同的 HDate

RecID       HDate        HNumber     HComb
----------------------------------------------
1           2017-1-30       1          12
3           2017-1-29       1          15
5           2017-1-30       2          12
6           2017-1-30       3          12
9           2017-1-30       4          12

但在编辑表单中我不知道如何防止这种情况,

我在存储过程中尝试此代码,但它适用于某些 HNumber,但它会阻止其他一些 HNumber 在它自己的日期中被编辑

Create Procedure UpdCombHarByRecID

@RecID int,
@HarvestDate Date,
@HiveNumber int,
@HoneyComb Float, 

as

if NOT Exists (Select * From tHoneyHarvest Where RecID=@RecID)
return 0   
//there is no record to be updated

if Exists (Select * From tHoneyHarvest Where HarvestDate=@HarvestDate AND
 HiveNumber=HiveNumber And
 RecID!=@RecID) 
 // I hoped this should do the job 
 //(RecID is PrimaryKey and it is identity)
return 2

Update tHoneyHarvest 

Set HarvestDate=@HarvestDate,
HoneyType=@HoneyType,
HoneyComb=@HoneyComb,
HoneyDetails=@HoneyDetails

Where RecID=@RecID
return 1

现在问题出在哪里?

【问题讨论】:

  • 使用 single UPDATE...FROM...WHERE 语句,其WHERE 子句可消除重复项。多个Exists 语句只会使代码更难阅读和理解。
  • @PanagiotisKanavos 用户无法更改 HNumber,但可以编辑 HDate,我想检查 HNumber 是否已经在新编辑的 HDate 中有记录,以防止更新任何字段并且什么都不做
  • HiveNumber=HiveNumber 将始终为真。应该是 HiveNumber=@HiveNumber?
  • 您可以在 Hdate 和 HNumber 列上创建唯一索引。检查这篇文章stackoverflow.com/questions/11754754/…
  • @SaraniO 你应该做的是从 SSMS "CREATE UNIQUE INDEX IX_Date_Number ON tHoneyHarvest (HDate, HNumber);" 启动这样的命令当您尝试在 2 个索引字段上输入相同的两次相同的日期时,您将获得异常,在这里您可以找到 microsoft 文档 msdn.microsoft.com/en-us/library/ms187019.aspx

标签: sql-server stored-procedures


【解决方案1】:

最好的方法是使用非聚集索引。非聚集索引在插入或更新发生时防止重复记录。

CREATE UNIQUE INDEX MyIndex ON ExcelTable(HDate, HNumber)

请参考

【讨论】:

    【解决方案2】:

    感谢评论中的帮助。问题是由于程序中的拼写错误造成的。

    if Exists (Select * From tHoneyHarvest Where HarvestDate=@HarvestDate AND
      HiveNumber=@HiveNumber And
      RecID!=@RecID) 
    

    我忘记在 HiveNumber 之前添加 @

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多