Мне нужно обновить запись в таблице, но возможно, что запись не существует, поэтому мне нужно будет вставить запись.
Ниже приведен оператор SQL, который выполнил мою задачу, сначала попытавшись обновить запись, а если она не существует, она выполняет вставку. Что мне интересно, может ли он быть выполнен непосредственно через объект команды ADO.NET или ему нужно перейти в хранимую процедуру.
UPDATE MyTable SET ReservationDate = @ReservationDate WHERE CustomerNumber = XXXX;
IF @@ROWCOUNT=0
INSERT INTO MyTable (CustomerNumber , ReservationDate)
VALUES (@CustomerNumber , @ReservationDate)
Если бы я мог выполнить его с помощью объекта команды без хранимой процедуры, это означало бы одну меньшую зависимость от времени развертывания (т.е. развертывание хранимой процедуры).
Команда 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, разделенные точкой с запятой
Merge
. Спасибо!