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
Manjuboyz,
以下几点可以帮助你了解什么是在代码中发生的事情。
- 正如你所提到的“有两种环境,Insert语句在一个环境中工作正常,而不是在另一个环境中工作”。基于这个陈述,我能否建议你检查两个环境中是否存在相同的约束条件。
这里的CHECK约束是检查插入的值是否具有指定的值。如果失败,那么约束将失败,并出现您提到的错误。因此,请使用TRY,CATCH将插入语句置于TRY下执行异常处理。因此,如果在CATCH块中有任何错误,您可以捕获错误,并且插入[LocationID]和[LevelOfCareGroupID]的值。
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也会失败
您能否提供引发错误的参数值? –
这些参数在许多地方,因此使得苦苦追寻的价值时,你有什么更好的办法是找到这些参数的值是多少? – Manjuboyz
对不起,我想'当我们试图手动运行一个记录时,它会抛出一个错误',这意味着你重新创建了错误。一旦方法将插入语句包装在[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)名称添加到您的日志表中。 –