gpt4 book ai didi

sql-server - 使 SQL Server 仅在插入或更新的行上使用 CHECK CONSTRAINT

转载 作者:行者123 更新时间:2023-12-04 00:46:32 25 4
gpt4 key购买 nike

我想将业务规则应用到表中的行(SQL Server 2008)。但是,表中有不符合此规则的历史数据,并且没有好的方法使其符合(未知值,没有合理的默认值。)所以我希望 CHECK CONSTRAINT 在新插入的行或更新行时进行检查。

我创建了这样一个约束,并设置了以下值:

  • 在创建或重新启用时检查现有数据:否
  • 强制执行 INSERT 和 UPDATE:是
  • 强制复制:是

当我插入一条新记录时,一切似乎都很好。但是,如果我更新记录,即使更新的记录符合 CHECK CONSTRAINT,CHECK CONSTRAINT 也会失败。就好像它在更新单个行时试图将约束应用于所有行一样。我怎样才能避免这种情况?

这是约束条件:

([DateGiven] IS NULL 
AND [PrimaryConsultantId] IS NULL
AND [AdditionalConsultants] IS NULL
AND [ResultingClaLevel] IS NULL)
OR ([DateGiven] IS NOT NULL
AND [PrimaryConsultantId] IS NOT NULL
AND [AdditionalConsultants] IS NOT NULL
AND [ResultingClaLevel] IS NOT NULL))

更新是通过存储过程完成的:(ClaEvaluationId 是主键)

CREATE PROCEDURE [dbo].[UpdateProc] (
@ClaEvaluationId int,
@DateScheduled datetime,
@DateGiven datetime,
@PrimaryConsultantId int,
@AdditionalConsultants nvarchar(500),
@ResultingClaLevel decimal(2,1)
) AS

SET NOCOUNT ON

UPDATE [dbo].[ClaEvaluation]
SET
[DateScheduled] = @DateScheduled
,[DateGiven] = @DateGiven
,[PrimaryConsultantId] = PrimaryConsultantId
,[AdditionalConsultants] = @AdditionalConsultants
,[ResultingClaLevel] = @ResultingClaLevel
WHERE [ClaEvaluationId] = @ClaEvaluationId

最佳答案

您程序中的以下行是错误的:

,[PrimaryConsultantId] = PrimaryConsultantId

应该是

,[PrimaryConsultantId] = @PrimaryConsultantId

您的约束按预期工作,并为您暴露了一个错误。

关于sql-server - 使 SQL Server 仅在插入或更新的行上使用 CHECK CONSTRAINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9116528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com