SQL 2008 R2: попытка заставить оператор слияния T-SQL работать в хранимой процедуре
Я посмотрел на различные примеры инструкции SQL Merge.. все они выглядят превосходно, хотя по какой-то причине я не могу получить правильные/ожидаемые результаты от моего теста слияния.
краткий обзор: У меня есть простая таблица с некоторыми проектными данными в ней.. и чтение о слиянии, кажется, указывает на более эффективный способ выполнения 'upsert' (то есть: вставка или обновление в зависимости от того, существует запись или нет).
Итак, код SQL 2008 идет что-то вот так (извините, если он не полностью завершен, так как я работаю над ним!):
это будет в хранимой процедуре, поэтому значения@, очевидно, являются переданными парами..
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 новые вставки, которые, как я предполагаю, не просто случайность..
Надеюсь, я правильно объяснил это.. часть атаки на что-то новое-это в основном получение правильного контекста, верно?Заранее спасибо за любую обратную связь.
P. S: извините, в конце инструкции merge стоит точка с запятой! для завершения проверки синтаксического анализа / синтаксис.
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)