Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Instrukcja SQL Server 2008 MERGE — jak wyłączyć wyzwalacz INSTEAD OF INSERT, aby umożliwić MERGE

Optymalizator zapytań przeprowadza statyczną analizę wsadu T-SQL i jak tylko zobaczy instrukcję MERGE, sprawdzi poprawność wymagań. NIE uwzględni żadnych instrukcji DDL, które mają wpływ na wyzwalacze przed instrukcją MERGE.

Możesz obejść ten problem za pomocą GO, aby podzielić instrukcje na oddzielne partie, ale jeśli jest to pojedynczy SP (bez instrukcji GO), masz dwie możliwości

  • umieść MERGE w podporowym SP, który wywołuje główny; lub
  • użyj dynamicznego SQL

Dynamiczny SQL

Stwórzmy tabelę z wyzwalaczem

create table tg1(i int)
;
create trigger tg1_tg on tg1 instead of insert as 
select 1
GO

Następnie spróbuj MERGE na stole

alter table tg1 disable trigger tg1_tg
;
merge tg1 as target
using (select 1 union all select 3) as source (X) on target.i = source.x
when matched then
    delete
when not matched by target then
    insert (i) values (x)
output $action, inserted.*, deleted.*
;
alter table tg1 enable trigger tg1_tg
;

Niedobrze..

Używamy więc dynamicznego SQL

alter table tg1 disable trigger tg1_tg
;
exec ('
merge tg1 as target
using (select 1 union all select 3) as source (X) on target.i = source.x
when matched then
    delete
when not matched by target then
    insert (i) values (x)
output $action, inserted.*, deleted.*
;')
alter table tg1 enable trigger tg1_tg
;

Procedura wsparcia

Stwórzmy procedurę, która wykona MERGE (proc produkcyjny prawdopodobnie miałby zmienną tabeli, użyj tabeli #temp lub przejął jakieś parametry)

create proc tg1_MERGE as
merge tg1 as target
using (select 1 union all select 3) as source (X) on target.i = source.x
when matched then
    delete
when not matched by target then
    insert (i) values (x)
output $action, inserted.*, deleted.*
;
GO

Nie idź...

Nawet aby go utworzyć, musisz wyłączyć wyzwalacze - więc wyłącz wyzwalacz i ponownie utwórz proc - tym razem zadziała.

Wreszcie możesz uruchomić tę partię, która działa

alter table tg1 disable trigger tg1_tg
;
exec tg1_MERGE
;
alter table tg1 enable trigger tg1_tg
;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakie kolumny generalnie tworzą dobre indeksy?

  2. JSON_QUERY() vs JSON_VALUE() w SQL Server:jaka jest różnica?

  3. SQL Server Alokacja kwoty na rachunku

  4. Poprawka:„Nie można wykonać DZIENNIKA KOPII ZAPASOWEJ, ponieważ nie ma bieżącej kopii zapasowej bazy danych”. w SQL Server/SQL Edge

  5. Zwróć parametry procedury składowanej lub funkcji zdefiniowanej przez użytkownika w programie SQL Server (przykłady T-SQL)