我有下面的代码表A在列Denial
上有一个检查约束。
CREATE TABLE Table a
(
[ID] int IDENTITY(1,1) NOT NULL ,
[EntityID] int ,
Denial nVarchar(20)
CONSTRAINT Chk_Denial CHECK (Denial IN ('Y', 'N')),
)
Merge陈述式
MERGE INTO Table a WITH (HOLDLOCK) AS tgt
USING (SELECT DISTINCT
JSON_VALUE(DocumentJSON, '$.EntityID') AS EntityID,
JSON_VALUE(DocumentJSON, '$.Denial') AS Denial
FROM Table1 bd
INNER JOIN table2 bf ON bf.FileUID = bd.FileUID
WHERE bf.Type = 'Payment') AS src ON tgt.[ID] = src.[ID]
WHEN MATCHED
)) THEN
UPDATE SET tgt.ID = src.ID,
tgt.EntityID = src.EntityID,
tgt.Denial = src.Denial,
WHEN NOT MATCHED BY TARGET
THEN INSERT (ID, EntityID, Denial)
VALUES (src.ID, src.EntityID, src.Denial)
THEN DELETE
运行MERGE语句时出现以下错误:
错误消息547,级别16,状态0,过程storproctest1,第40行[批处理开始行0]
MERGE语句与CHECK约束“Chk_Column”冲突。冲突发生在数据库“Test”、表“Table1”和列“Denial”中。该语句已终止。
这是因为源文件中有**“Yes”和“No”,而不是'Y'和'N'**。因此,我得到了上面的错误。
如何在合并语句中使用Case语句来处理上述Check约束错误?或任何替代解决方案。
1条答案
按热度按时间e3bfsja21#
您可以在合并数据 * 之前 * 将
Yes
转换为Y
,将No
转换为N
。这将属于合并查询的using
子句:case
表达式转换Y和N值,并保留其他值不变。因为这适用于源数据集,所以整个查询的其余部分都受益(即update
和insert
分支)。