SQL 2008 R2: Попытка заставить оператор T-SQL MERGE работать в хранимой процедуре - PullRequest
2 голосов
/ 16 февраля 2011

Я рассмотрел различные примеры оператора 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 новых вставок, которые, я предполагаю, не просто случайность ..

Надеюсь, я все правильно объяснил ... часть атаки на что-то новое в основном приводит к правильному контексту?

Заранее спасибо за любые отзывы.

P.S: Извините, в конце оператора слияния стоит точка с запятой! завершить проверку / синтаксический анализ.

1 Ответ

5 голосов
/ 16 февраля 2011

Вы используете 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)
...