Да, ==
плохо для сравнения строк (любые объекты действительно, если вы не знаете, что они канонические). ==
просто сравнивает ссылки на объекты. .equals()
тесты для равенства. Для строк часто они будут такими же, но, как вы обнаружили, это не гарантируется всегда.
«Проблема», с которой вы сталкиваетесь при слиянии, заключается в том, что он будет выполнять одно или другое. Если условие соединения работает, записи обновляются в pcevactor
. Если объединение не сработает, записи будут вставлены в pcevactor
Вы, кажется, говорите, что ваша таблица #tmpappoint
в настоящее время заполнена типом 'L', поэтому условие объединения НЕ будет работать, и ВСТАВКА всегда будет использоваться.
Если вы хотите, чтобы время от времени использовалось ОБНОВЛЕНИЕ (то есть, если ev.evid = ap.evid and
ev.officer = ap.optionalid
сработало) в случае 'L' в #tmpappoint
, то вам нужно будет поставить 'L' в IN как хорошо:
optionaltype in ('L', 'O', 'C', 'U'))
Если #tmpappoint
содержит все виды кодов, и вы хотите сейчас делать только 'L', уточните таблицу #tmpappoint у источника:
Помните, что таблица или запрос после ИСПОЛЬЗОВАНИЯ в операторе слияния - это набор данных, который управляет слиянием; только те строки в ap (будь то запрос или таблица) будут найдены в pcevactor
, и обновления или вставки будут выполняться по мере необходимости. Строки, не упомянутые в ap
, не затрагиваются
Из-за расширения вышеприведенного:
Если #tmpappoint
содержит все виды кодов, и вы НЕ хотите делать что-либо другое чем O, C, U прямо сейчас, уточните таблицу #tmpappoint у источника (и удалите условие слияния, так как оно больше не нужно):
merge pcevactor ev
using (Select * from #tmpappoint where optionaltype in ('O', 'C', 'U')) ap
on (ev.evid = ap.evid and
ev.officer = ap.optionalid
)
when matched then
Если ваши данные в #tmppappoint
в некотором роде является недостатком, например, когда optiontype типа 'L' означает, что в качестве идентификатора нужно использовать идентификатор badge_number, а не его employee_number, вы можете манипулировать данными с помощью запроса, прежде чем пытаться объединить их:
MERGE ...
USING (
SELECT
...,
--let's change what we put in optionalid depending on the code
CASE
WHEN code = 'L' THEN badges.badge_number
ELSE t.employee_number
END as optionalid,
...
FROM
#tmpappoint t
JOIN
badges ON badges.officer_code = t.officer_code
...
В этом случае, если это L, то мы ставим, например, их номер значка в качестве идентификатора, в противном случае мы добавляем код employee_ .. Мы предварительно обрабатываем данные, чтобы сработали условия включения слияния