Операторы Multi SQL, выполняемые через объект команды ADO.NET

1

Мне нужно обновить запись в таблице, но возможно, что запись не существует, поэтому мне нужно будет вставить запись.

Ниже приведен оператор SQL, который выполнил мою задачу, сначала попытавшись обновить запись, а если она не существует, она выполняет вставку. Что мне интересно, может ли он быть выполнен непосредственно через объект команды ADO.NET или ему нужно перейти в хранимую процедуру.

UPDATE MyTable SET ReservationDate = @ReservationDate WHERE CustomerNumber = XXXX;
IF @@ROWCOUNT=0
  INSERT INTO MyTable (CustomerNumber , ReservationDate) 
  VALUES (@CustomerNumber , @ReservationDate)

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

Теги:
sql-server
ado.net

1 ответ

2
Лучший ответ

Команда MERGE в T-SQL работает только для этого сценария

string cmdText = @"MERGE MyTable T
                   USING (SELECT @CustomerNumber As CustomerNumber) as S 
                   ON T.CustomerNumber = S.CustomerNumber
                   WHEN MATCHED UPDATE SET ReservationDate = @ReservationDate 
                   WHEN NOT MATCHED INSERT INTO (CustomerNumber , ReservationDate)  
                                    VALUES (@CustomerNumber , @ReservationDate)";

Это всего лишь одна строка текста, завернутая для удобочитаемости в нескольких строках благодаря дословному символу @

С помощью MERGE вы начинаете определять таблицу TARGET (T), затем вы создаете псевдоним SOURCE (S) с параметром, который содержит значение для поля первичного ключа в TARGET. Теперь две таблицы JOINED ON к полю CustomerNumber. Продукт этого объединения может быть MATCHED или NOT MATCHED зависимости от предыдущего присутствия записи в таблице TARGET. Остальная часть запроса, вероятно, сама объясняет, просто заметите, что в двух действиях (UPDATE и INSERT) нет необходимости повторять имя MyTable (это TARGET)

Кстати, да, вы могли бы передать несколько команд в SqlCommand, разделенные точкой с запятой

  • 0
    Потрясающий ответ и кристально чистый пример! Я никогда не знал о команде Merge . Спасибо!
  • 0
    Может ли это также сработать, если при определении того, какие записи были обновлены / вставлены, было использовано поле больше, чем? Например ... что если это был не просто CustomerNumber, но также VehicleNumber, который использовался при обновлении / вставке бронирования? Например, если у клиента было несколько автомобилей.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню