INSERT语句与数据库中发生的CHECK约束冲突发生冲突

问题描述:

上述主题行的解决方案存在于多个链接中,并且遇到了所有链接,并且找不到我的问题的解决方案。INSERT语句与数据库中发生的CHECK约束冲突发生冲突

这里是我的查询:

INSERT INTO PatientPatternElements (PatientPatternsID, ASEventID, LocationID, EffectiveDate, EffectiveDateEnd, WorkloadStartDate, WorkloadEndDate) 
       SELECT DISTINCT PatientPatterns.ID, 
         @hl7event_id, 
         @default_locationid, 
         @hl7event_effective_date, 
         @hl7event_effective_date, 
         @hl7event_effective_date, 
         @hl7event_effective_date 
       FROM PatientPatternElements 
       INNER JOIN PatientPatterns 
        ON PatientPatternElements.PatientPatternsID = PatientPatterns.ID 
       WHERE PatientPatterns.PatientEncounterID = @patient_encounter_id 
        AND PatientPatterns.Visit = @patient_encounter_visit 

       --------------------- 
       -- Error Checking 
       ---------------------- 
       SET @SysError = @@error 
       IF @SysError != 0 
       BEGIN 
        SET @iError = 23063 
        SET @strErrorMsg = 'Error Applying Manual Discharge Event, Error: ' + cast(@SysError AS varchar(256)) + ' encounter_id=' + cast(@patient_encounter_id as varchar(64)) 
        GOTO ERROR 
       END 

这只是我的我的存储过程的代码的一部分。

工作流程

这是发生在在客户端测试环境的版本之一,客户有一个更版本和流工作没有任何问题。 当我们试图运行记录手动它是在我们的日志表的一个抛出一个错误,并抛出以下消息:

THREAD 4: ApplyPatientPatternEvents: Recovering from SQL exception: The INSERT statement conflicted with the CHECK constraint "CK_PatientPatternElements_Location". 
The conflict occurred in database "db_name", table "dbo.PatPatternElements". 

Rolling back Transaction. spHL7ApplyPatientPatternEvents: Error Applying Manual Discharge Event, Error: 547 encounter_id=20 

我前面说这是发生在只有一个版本,存储过程在两个版本中都是相同的,这使得很难找出问题。

在事件查看器中没有任何记录,并且跟踪sql profiler也没有多大帮助,因为SP spHL7ApplyPatientPatternEvents从未出现在profiler中。

任何人都可以给出一个想法究竟发生了什么?

这是约束的查询。

ALTER TABLE [dbo].[PatientPatternElements] WITH CHECK ADD CONSTRAINT [CK_PatientPatternElements_Location] CHECK (([LocationID] IS NULL AND [LevelOfCareGroupID] IS NOT NULL OR [LocationID] IS NOT NULL AND [LevelOfCareGroupID] IS NULL)) 
GO 

ALTER TABLE [dbo].[PatientPatternElements] CHECK CONSTRAINT  [CK_PatientPatternElements_Location] 
GO 
+0

您能否提供引发错误的参数值? –

+0

这些参数在许多地方,因此使得苦苦追寻的价值时,你有什么更好的办法是找到这些参数的值是多少? – Manjuboyz

+0

对不起,我想'当我们试图手动运行一个记录时,它会抛出一个错误',这意味着你重新创建了错误。一旦方法将插入语句包装在[try ... catch块](https://msdn.microsoft.com/en-gb/library/ms175976.aspx)中。使用catch块转移的参数值,[用户](https://msdn.microsoft.com/en-us/library/ms187934.aspx)和[主机](https://msdn.microsoft.com/en- us/library/ms178598.aspx)名称添加到您的日志表中。 –

Manjuboyz,

以下几点可以帮助你了解什么是在代码中发生的事情。

  1. 正如你所提到的“有两种环境,Insert语句在一个环境中工作正常,而不是在另一个环境中工作”。基于这个陈述,我能否建议你检查两个环境中是否存在相同的约束条件。
  2. 这里的CHECK约束是检查插入的值是否具有指定的值。如果失败,那么约束将失败,并出现您提到的错误。因此,请使用TRY,CATCH将插入语句置于TRY下执行异常处理。因此,如果在CATCH块中有任何错误,您可以捕获错误,并且插入[LocationID]和[LevelOfCareGroupID]的值。

  3. ALTER TABLE [dbo].[PatientPatternElements] WITH CHECK ADD CONSTRAINT [CK_PatientPatternElements_Location] CHECK (([LocationID] IS NULL AND [LevelOfCareGroupID] IS NOT NULL OR [LocationID] IS NOT NULL AND [LevelOfCareGroupID] IS NULL)) GO

根据您所提供的,我们可以理解的是,插入语句将工作上面的CHECK约束,只有当“那些paramters中的任何一个”,即[LocationID][ LevelOfCareGroupID]为NULL。但不是BOTH

即,如果[位置ID]是NULL,并且[LevelOfCareGroupID]是NULL。那么INSERT将失败

类似地,如果[LocationID]不是NULL,并且[LevelOfCareGroupID]不是NULL。那么INSERT也会失败