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)
Другие вопросы по тегам