Подстановочный знак в значении в выражении MERGE ON - PullRequest
2 голосов
/ 09 мая 2019

У меня есть оператор слияния, который начинается следующим образом:

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 для группировки исходных строк.

Я убедился, что в моей таблице нет дубликатов.Единственное, о чем я могу думать, это то, что я упомянул выше, что часть ON оператора слияния видит, что * как символ подстановки.

Я пробовал искать, видел что-то о escape-символе, но это былов пункте, где.Есть идеи как с этим бороться?

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Так что моя теория в моем первоначальном посте была неверной.В моей исходной таблице были дубликаты, но она основывалась на чувствительности к регистру.Были значения H04F и H04f.Обе разные строки, но из-за нечувствительности к регистру в моем sql, он видел их как дубликаты.Чтобы решить эту проблему, я добавил COLLATE Latin1_General_CS_AS в конец предложения ON, и он добился цели

1 голос
/ 09 мая 2019

Это означает, что у вас есть более 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...