Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pernyataan SQL Server 2008 MERGE - cara menonaktifkan pemicu INSTEAD OF INSERT untuk mengizinkan MERGE

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
;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server REPLACE() vs TRANSLATE():Apa Perbedaannya?

  2. SQL Query - Ubah format tanggal dalam kueri menjadi DD/MM/YYYY

  3. <fungsi bernilai tabel> bukan nama fungsi bawaan yang dikenali

  4. Memasukkan Daftar<> ke dalam tabel SQL Server

  5. Bagaimana cara menggunakan kembali sub kueri di sql?