Почему WHEN MATCHED 'не может появляться более одного раза в предложении UPDATE в заявлении MERGE?

Я беру кучу CRUD-операций и создаю слияние памяти с CUD. Мой сохраненный proc выглядит так

CREATE PROCEDURE usp_AdministrationHistoryMerge @AdministrationHistoryID int out, @AdministratorID int, @DateCreated datetime, @CreatedBy nvarchar(50), @ModifiedBy nvarchar(50), @Action int AS SET NOCOUNT OFF SET TRANSACTION ISOLATION LEVEL READ COMMITTED DECLARE @ERROR_SEVERITY int, @MESSAGE varchar(1000), @ERROR_NUMBER int, @ERROR_PROCEDURE nvarchar(200), @ERROR_LINE int, @ERROR_MESSAGE nvarchar(4000), @IsActive bit, @DateModified datetime; begin try if @Action = 1 begin set @IsActive = 1 set @AdministrationHistoryID = SCOPE_IDENTITY() end merge [AdministrationHistory] as target using (select @AdministratorID, @DateCreated, @CreatedBy, @DateModified, @ModifiedBy, @IsActive) as source (AdministratorID, DateCreated, CreatedBy, DateModified, ModifiedBy, IsActive) on (target.AdministrationHistoryID = source.AdministrationHistoryID) when matched and @Action = -1 then update set IsActive = 0 when matched and @Action = 0 then update set ModifiedBy = @ModifiedBy, DateModified = GETDATE() when matched and @Action = 1 then insert (AdministratorID, DateCreated, CreatedBy, IsActive) values (@AdministratorID, @DateCreated, @CreatedBy, @IsActive); end try BEGIN CATCH SET @ERROR_SEVERITY = ISNULL(ERROR_SEVERITY(),''); SET @ERROR_NUMBER = ISNULL(ERROR_NUMBER(),''); SET @ERROR_PROCEDURE = ISNULL(ERROR_PROCEDURE(),''); SET @ERROR_LINE = ISNULL(ERROR_LINE(),''); SET @ERROR_MESSAGE = ISNULL(ERROR_MESSAGE(),''); -- Test if the transaction is uncommittable. IF (XACT_STATE()) = -1 BEGIN --PRINT N'The transaction is in an uncommittable state. Rolling back transaction.' ROLLBACK TRANSACTION; END; -- Test if the transaction is active and valid. IF (XACT_STATE()) = 1 BEGIN --PRINT N'The transaction is committable. Committing transaction.' COMMIT TRANSACTION; END; SET @MESSAGE = 'Error Occured in Stored Procedure ' + cast(@ERROR_PROCEDURE as varchar(200)) + '; Line Number ' + cast(@ERROR_LINE as varchar) + '; Message: [' + cast(@ERROR_NUMBER as varchar) + '] - ' + cast(@ERROR_MESSAGE as varchar(255)) RAISERROR(@MESSAGE, @ERROR_SEVERITY, 1); END CATCH; 

Когда я иду, чтобы выполнить это, я получаю эту полную ошибку

Msg 10714, уровень 15, состояние 1, процедура usp_AdministrationHistoryMerge, строка 36 Действие типа WHEN MATCHED не может появляться более одного раза в предложении UPDATE оператора MERGE.

Я просмотрел SO и нашел пару способов решить эту проблему, но то, что я нашел, не является подходящим решением для этой ошибки, а вместо удаления, и мне нужно обновить IsActive записи до 0.

Кроме того, в моих поисках никто действительно не объясняет, почему эта ошибка возникает, да, я знаю ее очевидную, потому что ошибка там, но почему это не разрешено? и исходя из этого обстоятельства, есть ли идея о том, как это сделать? или мне нужно, чтобы этот слияние вызывал другой хранимыйпродукт, когда @Action равно 0?

В своем заявлении WHEN MATCHED вас есть три условия WHEN MATCHED

  • Два с UPDATE
  • Один с INSERT .

Однако это недопустимо. Это четко указано в Документации по MERGE :

В заявлении WHEN MATCHED может быть не более двух предложений WHEN MATCHED .

А также

Если есть два предложения WHEN MATCHED , то необходимо указать действие UPDATE и указать действие DELETE .

Также важно знать:

Если в предложении <merge_matched> указано UPDATE , и более одной строки <table_source> соответствует строке в target_table на основе <merge_search_condition>, SQL Server возвращает ошибку. Оператор MERGE не может обновлять одну и ту же строку более одного раза или обновлять и удалять одну и ту же строку.

  • Как запустить программу или сценарий PowerShell после завершения плана обслуживания SQL Server?
  • Вставьте дочерние узлы из переменной XML xml в другую переменную xml
  • Добавить несколько значений SQL с тем же параметризованным запросом?
  • Как написать запрос для вставки данных в две таблицы с отношениями внешних ключей в SQL Server?
  • Кэширование SQL-запросов
  • Слияние SQL, удаляющее все мои строки в целевой таблице
  • MERGE - Несколько случаев, КОТОРЫЕ СОБИРАЛИСЬ С ПОМОЩЬЮ
  • Множественное слияние с несколькими строками
  • Зачем использовать более короткие поля VARCHAR (n)?
  • Оператор SQL Server MERGE с «DUAL» в разделе использования
  • Типы данных Sql Server 2005
  • Interesting Posts

    Подключение локальной базы данных sql

    Спящий режим, Сохраненные процедуры и неверная ошибка индекса параметра

    Программно создавать файл базы данных MS SQL Compact на рабочем столе

    Как я могу обеспечить отсутствие отрицательного столбца?

    Возможно ли иметь таблицу с переменными столбцами?

    Повысить производительность выборки данных из View

    Левый Присоедините две таблицы и получите unmapped значения как Unknown

    Запуск мастера генерации схемы передачи SQL с параметром datetime в biztalk

    Определение индивидуального пользователя sql в профилировщике SQL и мониторинг активности

    SQL-запрос, который возвращает столбцы с таблицей A плюс бит-столбец, который указывает, существует ли PK таблицы A в таблице B

    SQL-Как разделить две даты в годовой формат

    Поиск клиентов с идентичными заказами

    Что означает значение -9 для fetch_status в SQL Server?

    Конкатальный агрегат SQL Server T-SQL

    SQL Server добавляет пользователя в базу данных MDF

    Давайте будем гением компьютера.