Pengoptimal Kueri melakukan penguraian statis kumpulan T-SQL Anda, dan segera setelah melihat pernyataan MERGE, ia akan memvalidasi persyaratan. Ini TIDAK akan memperhitungkan pernyataan DDL apa pun yang memengaruhi pemicu sebelum pernyataan MERGE.
Anda dapat mengatasinya menggunakan GO untuk memecah pernyataan menjadi kumpulan terpisah, tetapi jika dalam satu SP (tidak ada pernyataan GO), Anda memiliki dua pilihan
- masukkan MERGE ke dalam SP dukungan yang dipanggil oleh yang utama; atau
- gunakan SQL dinamis
SQL Dinamis
Mari buat tabel dengan pemicu
create table tg1(i int)
;
create trigger tg1_tg on tg1 instead of insert as
select 1
GO
Kemudian coba MERGE di atas meja
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
;
Tidak bagus..
Jadi kami menggunakan SQL dinamis
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
;
Prosedur dukungan
Mari buat prosedur yang akan melakukan MERGE (proc produksi mungkin akan memiliki variabel tabel, gunakan tabel #temp atau ambil beberapa parameter)
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
Jangan pergi...
Bahkan untuk membuatnya, Anda perlu menonaktifkan pemicu - jadi nonaktifkan pemicu dan buat proc lagi - kali ini akan berhasil.
Akhirnya, Anda dapat menjalankan kumpulan ini yang berfungsi
alter table tg1 disable trigger tg1_tg
;
exec tg1_MERGE
;
alter table tg1 enable trigger tg1_tg
;