«Зачем мне нужен такой запрос?» Оператор update into выгоден по двум основным причинам:

  • Постановка Атомная; либо оба происходят, либо ничего не происходит, т. е. если либо обновление, либо вставка не удались, он откатывает изменения.
  • Это дешевле: ваша база данных должна искать записи только один раз. В качестве альтернативы, выполнение отдельной вставки и удаления требует двух поисков
  • Право на хвастовство: произведите впечатление на своего босса и коллег

Убежденный? «Покажите мне уже код!». Хорошо, но сначала нам нужно настроить несколько таблиц, чтобы продемонстрировать запрос. Позволяет код:

Настройка: создайте несколько таблиц с данными

Представьте, что у нас есть новостной сайт с большим количеством статей. Если пользователь замечает орфографическую ошибку в одной из статей, он может сообщить об ошибке через веб-сайт. Ошибки сохраняются в таблице под названием SpellingErrors. Мы сохраним идентификатор статьи, содержащей ошибку, вместе с сообщением и адресом электронной почты репортера. Мы сохраняем адрес электронной почты, чтобы мы могли связаться с репортером по вопросам.

Когда один из наших авторов исправляет орфографическую ошибку, мы обновляем запись, устанавливая адрес электронной почты в NULL; нам это больше не нужно, и мы хотели бы гарантировать конфиденциальность репортера. Кроме того, мы хотели бы сохранить некоторую информацию об ошибке, чтобы мы могли ужасно наказать авторов, которые делают много ошибок. Для этого мы будем хранить некоторые данные в таблице под названием SpellingErrorsHistory. Давайте сначала создадим таблицы и вставим некоторые ошибки.

Выполните эти запросы. Если вы затем выберете из таблицы SpellingErrors, вы увидите следующее:

Выполнение нашего запроса

Давайте приступим к созданию запроса, ради которого вы здесь! Давайте проверим запрос, а затем объясним, что он делает.

Один из наших авторов исправил ошибку с идентификатором 1. Мы сохраним это в переменной с именем @targetId. Затем мы ОБНОВЛЯЕМ таблицу SpellingErrors и устанавливаем ReporterEmail в NULL, где Id равен @targetId (1). С помощью OUTPUT у нас есть доступ к столбцам, которые мы обновили из таблицы SpellingsErrors. Мы ВЫВОДИМ некоторые столбцы вместе с дополнительным (SolvedMessage) в таблицу SpellingErrorsHistory. Также обратите внимание, что мы не сохраняем данные электронной почты пользователей в этой таблице.

Поздравляем, вы сделали это! Это простой и безопасный запрос, который позволяет выполнять два запроса одновременно.

Вывод

Используя этот запрос, мы можем выполнить атомарную операцию, которая обновляет записи из одной таблицы, одновременно вставляя эти обновленные записи в другую. Также проверьте:

Удачного кодирования!

— Майк

P.S. Нравится, что я делаю? "Подписывайтесь на меня"!