SQL 2008 R2: Попытка заставить оператор T-SQL MERGE работать в хранимой процедуре
Я рассмотрел различные примеры оператора SQL Merge. Все они выглядят превосходно, хотя по некоторым причинам я не могу получить правильные / ожидаемые результаты от моего теста Merge.
Быстрый обзор: у меня есть простая таблица с некоторыми проектными данными в ней... и чтение о MERGE, кажется, указывает на более эффективный способ выполнения "upsert" (то есть: вставка или обновление в зависимости от того, существует запись или нет).
Таким образом, код SQL 2008 выглядит примерно так (извините, если он не полностью завершен, так как я работаю над этим!):
Это будет в хранимой процедуре, поэтому @values - это явно переданные параметры.
merge designs as ds
using ( select designname, designcode from designs) as dsi
on (@passedDesignName = dsi.designname and @passedDesignCode = dsi.designcode)
when matched then
update set ds.designname = @passedDesignName, ds.designcode = @passedDesignCode
when not matched then
insert (designname, designcode)
values (@passedDesignName, @passedDesignCode)
Кажется, проблема в 7 записях, с которыми я тестирую, ВСЕ из них, кажется, обновляются, когда ясно, что я вижу только одну запись, которая соответствует обновлению... и странно, если я передаю некоторые НОВЫЕ данные (designname и designcode), я, кажется, получил повторяющуюся вставку.. из моего последнего теста казалось, что 7 новых вставок, которые я предполагаю, не просто случайность..
Надеюсь, я объяснил это правильно... часть атаки на что-то новое в основном дает правильный контекст, верно?
Заранее спасибо за любые отзывы.
PS: Извините, в конце оператора слияния стоит точка с запятой! завершить проверку синтаксиса / синтаксиса.
1 ответ
Вы используете designs
в качестве целевой и исходной таблицы:
merge designs as ds
using ( select designname, designcode from designs) as dsi
Это эквивалентно:
merge designs as ds
using designs as dsi
Вместо этого попробуйте передать переменные в качестве исходной таблицы:
merge designs as ds
using (
select @passedDesignName as designname
, @passedDesignCode as designcode
) as dsi
on (ds.esignName = dsi.designname and ds.designCode = dsi.designcode)