SQL Server SQL合并语句检查约束错误

jvidinwx  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(157)

我有下面的代码表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约束错误?或任何替代解决方案。

e3bfsja2

e3bfsja21#

您可以在合并数据 * 之前 * 将Yes转换为Y,将No转换为N。这将属于合并查询的using子句:

USING (
    SELECT Distinct 
        JSON_VALUE(DocumentJSON, '$.EntityID') AS EntityID,
        CASE JSON_VALUE(DocumentJSON, '$.Denial') 
            WHEN 'Yes' THEN 'Y'
            WHEN 'No'  THEN 'N'
            ELSE JSON_VALUE(DocumentJSON, '$.Denial')
        END AS Denial             
    FROM Table1 bd
    INNER JOIN table2 bf ON bf.FileUID = bd.FileUID
    WHERE bf.Type = 'Payment' 
) AS src

case表达式转换Y和N值,并保留其他值不变。因为这适用于源数据集,所以整个查询的其余部分都受益(即updateinsert分支)。

相关问题