MERGE ON语句中值的通配符

时间:2019-05-09 15:06:23

标签: sql-server tsql

我有一个这样的合并语句:

MERGE INTO TEMSPASA
USING (SELECT *
       FROM OPENQUERY(orad, 'SELECT * FROM CDAS.TDWHCORG')) AS TDWHPASA ON TEMSPASA.pasa_cd = LTRIM(RTRIM(TDWHPASA.corg_id)) AND 
                         TEMSPASA.pasa_active_ind = TDWHPASA.corg_active_ind

WHEN MATCHED THEN
    UPDATE 
        SET 
            TEMSPASA.pasa_desc = LTRIM(RTRIM(TDWHPASA.corg_nm)),
            TEMSPASA.pasa_active_ind = TDWHPASA.corg_active_ind

WHEN NOT MATCHED THEN
    INSERT (pasa_cd, pasa_desc, pasa_active_ind)
    VALUES (LTRIM(RTRIM(TDWHPASA.corg_id)), TDWHPASA.corg_nm, TDWHPASA.corg_active_ind); 

有些pasa_cd类似于('H04','H04 *'),其中*不是通配符。但是我认为on语句会将其视为通配符,因为当我尝试运行merge语句时,出现以下错误:

  

MERGE语句尝试多次更新或删除同一行。当目标行与多个源行匹配时,就会发生这种情况。 MERGE语句不能多次更新/删除目标表的同一行。优化ON子句以确保目标行最多匹配一个源行,或使用GROUP BY子句对源行进行分组。

我已验证我的表中没有重复项。我唯一能想到的就是我上面提到的内容,即merge语句的ON部分将*视为通配符。

我尝试搜索,看到了有关转义字符的内容,但这在where子句中。有什么想法如何处理吗?

2 个答案:

答案 0 :(得分:1)

这意味着您在源表和目标表之间有不止1行匹配。您需要在这里找出问题所在的行。可能来自任何一个表。这样的事情应该可以帮助您确定问题的根源。

SELECT LTRIM(RTRIM(TDWHPASA.corg_id)) 
    , TDWHPASA.corg_active_ind
FROM CDAS.TDWHCORG as TDWHPASA
group by LTRIM(RTRIM(TDWHPASA.corg_id)) 
    , TDWHPASA.corg_active_ind
having count(*) > 1

select t.pasa_cd
    , t.pasa_active_ind
from TEMSPASA t
group by t.pasa_cd
    , t.pasa_active_ind
having count(*) > 1

答案 1 :(得分:1)

所以我在最初的帖子中的理论是错误的。我的源表中有重复项,但这是基于区分大小写的。有值H04F和H04f。两者都是不同的行,但是由于我的sql中不区分大小写,因此将它们视为重复项。为了解决该问题,我在ON子句的末尾添加了COLLATE Latin1_General_CS_AS,它可以解决问题