MS SQL — результат возврата условного обновления

#sql #sql-server #conditional #return-value

#sql #sql-сервер #условные операторы #возвращаемое значение

Вопрос:

У меня есть хранимая процедура, которая выполняет следующее.

Заполненные данные целевой таблицы проверяются на соответствие нескольким аналогичным исходным таблицам (на основе данных имени и адреса). Если совпадение найдено в первой таблице, то оно обновляет цель с помощью флага, определяющего, из какой исходной таблицы было получено совпадение. Однако, если он не находит соответствия, мне нужно, чтобы он просматривал следующую исходную таблицу и следующую до тех пор, пока совпадение не будет найдено или нет, в зависимости от обстоятельств.

Есть ли простой способ для инструкции UPDATE предоставить какое-либо возвращаемое значение, которое я могу запросить, чтобы сказать, обновила ли она целевую таблицу? Я хотел бы использовать это возвращаемое значение, чтобы я мог пропустить ненужную проверку последующих исходных таблиц.

В противном случае мне придется выполнить условное ОБНОВЛЕНИЕ, а затем выполнить отдельный запрос, чтобы определить, действительно ли ОБНОВЛЕНИЕ обновило флаг?

Комментарии:

1. Вам не нужно никаких условий, просто запускайте обновления одно за другим. Если он нашел идентификатор, он обновит таблицу, иначе ничего не произойдет.

Ответ №1:

Вероятно, самым безопасным подходом является использование OUTPUT предложения. Это вернет измененные строки в новую таблицу.

Вы можете проверить таблицу, были ли обновлены какие-либо строки.

Одним из преимуществ OUTPUT предложения является то, что вы можете обновлять несколько строк одновременно.

Комментарии:

1. опередил меня на секунду!

2. Вот это да! большое вам спасибо за этот невероятно быстрый ответ. Я прочитаю по предоставленной вами ссылке.

Ответ №2:

Мне нравится идея Гордона, но я не думаю, что вам это действительно нужно.

Просто запустите обновления по порядку:

 UPDATE BASE_TABLE
SET FLAG='first_table'
where FLAG IS null AND
EXIST (SELECT 1 FROM first_table f1 where f1.ID = ID)

UPDATE BASE_TABLE
SET FLAG='second_table'
where FLAG IS null AND
EXIST (SELECT 1 FROM second_table f2 where f2.ID = ID)
  


И так далее.
Вам не нужно проверять каждую строку условно, это было бы очень медленно.

Комментарии:

1. Привет, Питер, я не был уверен, что ты имел в виду в своем первоначальном ответе, но вскоре понял из твоего комментария, что могу просто проверить, есть ли в поле значение. Спасибо.

2. Питер, если гипотетически у меня были десятки команд обновления последовательно, подобных приведенной выше, и они были довольно ресурсоемкими. Если я нашел совпадение при первом обновлении, есть ли какой-либо другой способ пропустить другие обновления без последующего запроса для проверки того, что поле было обновлено?

3. Обновление пропустит уже обновленные строки, поскольку ФЛАГ равен null. Вам не нужно их проверять. Единственное, что вам нужно сделать, это зафиксировать их. Итак, в основном: НАЧАТЬ ПЕРЕДАЧУ; ОБНОВИТЬ; ЗАФИКСИРОВАТЬ ПЕРЕДАЧУ

Ответ №3:

вы можете поместить свое обновление в try / catch и вставить свой результат в другую таблицу