SQL Server存储过程创建重复项

时间:2013-05-08 15:00:01

标签: asp.net sql stored-procedures sql-server-2000

我正在使用SQL Server 2008和ASP.NET 4.0运行网站。我试图追踪一个问题,我的存储过程正在为同一日期创建重复的条目。最初我认为这可能是几个帖子问题,但重复的是记录相同的日期,直到毫秒。其中一个副本位于:'2013-04-26 15:48:28.323'除了id之外,所有数据都完全相同。

@check_date是存储过程的输入,它为我们提供了我们正在查看的特定日期(条目是每日佣人)

在存储过程中先获取

@formHeaderId,获取标题ID,因为这是一个与标题有1对多关系的详细信息表。

@getdate()条目是我找到重复条目的地方,有些条目包含不同行的确切getdate()值。

每个条目都不会发生这种情况,它在应用程序中随机出现。

select @formHeaderId=stage2_checklist_header_id 
from stage2_checklist_header 
where environmental_forms_id=@envFormId
and checklist_monthyear=@inspected_month 
order by start_date desc

if @formHeaderId = 0 begin

    insert into stage2_checklist_header(
        environmental_forms_id      
        ,start_date 
        ,checklist_monthyear
        ,st2h_load_date )
    values( @envFormId
            ,@check_date 
            ,@inspected_month 
            ,getdate())

    set @formHeaderId = scope_identity() 
    print 'inserted new header record ' + cast(@formHeaderId as varchar(50))

end 

IF (NOT EXISTS(
       SELECT *
         FROM stage2_checklist_detail
        WHERE  stage2_checklist_header_id = @formHeaderId
          AND check_date = @check_date
    ))
INSERT INTO stage2_checklist_detail
  (stage2_checklist_header_id, check_date, st2_chk_det_load_date, 
   inspected_by)
VALUES
  (@formHeaderId, @check_date, GETDATE(), @inspected_by)

SET @form_detail_id = SCOPE_IDENTITY()
    PRINT 'inserted detail record ' + CAST(@form_detail_id AS VARCHAR(50)) 

2 个答案:

答案 0 :(得分:0)

这是similar case,其中开发人员能够跟踪来自不同spid的同时调用的重复条目(其中包括EXISTS检查)。在尝试隔离级别和事务 - 并试图避免死锁之后 - 听起来像这种情况下的解决方案是使用sp_getapplock和sp_releaseapplock。

答案 1 :(得分:0)

NOT EXISTS检查中,您正在查找具有相同ID和相同日期的记录。因此,如果表中不存在ID和日期的组合,则将插入该行。 在您对问题的描述中,您声明“除了ID之外,所有数据都完全相同”。 ID不同将始终根据您用于检查存在的逻辑导致INSERT。