UPSERT - Apakah ada alternatif yang lebih baik untuk MERGE atau @@ rowcount? [Tutup]

14

Saya bertanya-tanya apakah Anda telah menemukan perintah T-SQL yang mirip dengan konsep UPSERT? Melakukan operasi INSERT | UPDATE menggunakan opsi (1) atau (2) tampaknya terlalu kompleks dan rawan kesalahan.

OBJEKTIF

Untuk memastikan bahwa catatan yang diinginkan (dalam hal ini employee_id 1) mutakhir TANPA harus harus pada dasarnya menulis permintaan yang sama dua kali.

KONTEKS

  • nama tabel: karyawan
  • id karyawan: memiliki kunci utama, dan proerty identitas disetel ke true

PILIHAN

  1. jalankan SQL UPDATE ... centang @@ rowcount = 0 dan @@ error = 0 ... jalankan SQL INSERT jika diperlukan

    • con: Anda secara efektif harus menulis permintaan yang sama dua kali, sekali sebagai sisipan, sekali sebagai pembaruan
    • con: lebih banyak kode = lebih banyak mengetik waktu
    • con: lebih banyak kode = lebih banyak ruang untuk kesalahan

/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure "Perbarui menggunakan @@ rowcount"

  1. jalankan SQL MERGE
    • con: Anda secara efektif harus menulis permintaan yang sama dua kali, sekali sebagai sisipan, sekali sebagai pembaruan
    • con: lebih banyak kode = lebih banyak mengetik waktu
    • con: lebih banyak kode = lebih banyak ruang untuk kesalahan

http://technet.microsoft.com/en-us/library/bb510625.aspx "T-SQL Merge"

  1. jalankan SQL UPSERT (fitur tidak ada)
    • pro: Anda mendefinisikan hubungan data-ke-tabel satu kali (biarkan SQL Server khawatir tentang apakah itu INSERT atau UPDATE)
    • pro: less code = implementasi lebih cepat
    • pro: kode kurang = probabilitas lebih rendah

CONTOH UPSERT

Karyawan UPSERT (employee_id, employee_number, job_title, first_name, middle_name, nama keluarga, modified_at) VALUES (1, '00 -124AB37 ',' Manajer ',' John ',' T ',' Smith ', GetDate ());

  • jika employee_id 1 tidak ada: MS SQL menjalankan pernyataan INSERT
  • jika ada employee_id 1: MS SQL mengeksekusi dan pernyataan UPDATE
Pressacco
sumber
4
Ini sepertinya permintaan fitur untuk Microsoft, bukan sesuatu yang bisa diselesaikan oleh siapa pun di sini. Solusi Microsoft datang dengan MERGE. Jika itu tidak fleksibel / cukup kuat untuk Anda, maka Anda memerlukan solusi berbeda yang belum ada.
Aaron Bertrand
3
Menurut pendapat saya, MERGEmudah, fleksibel, dan juga merupakan bagian dari SQL Standard. Masalah sebenarnya dengan MERGEdan UPSERTimplementasi lainnya adalah eskalasi kunci potensial atau bahkan kebuntuan yang tidak ada hubungannya dengan sintaksis.
a1ex07
Jika Anda memiliki pertanyaan, jangan ragu untuk bertanya. Seperti yang ditulis ini pada dasarnya adalah cacian tentang MERGEimplementasi dalam SQL Server.
JNK
Pertanyaan bagus - apakah pada dasarnya ada pernyataan UPSERT di mana server khawatir tentang apakah itu memerlukan penyisipan atau pembaruan. Saya setuju, MERGE tidak memenuhi apa yang Anda harapkan secara logis dari implementasi "UPSERT". Mengingat MS memilih untuk menerapkan cara ini, pertanyaan saya adalah: apa yang mungkin merupakan kekurangan, atau tidak mungkin untuk diterapkan, apakah mereka berusaha untuk mengimplementasikan sintaksis yang Anda (dan saya) inginkan?
youcantryreachingme

Jawaban:

14

Saya pikir jawaban sederhana untuk ini adalah tidak. MERGEadalah jawaban Microsoft untuk UPSERTlogika yang lebih berbelit-belit . Dan Anda bahkan tidak mencantumkan pendekatan terburuk:

IF (SELECT COUNT ... ) > 0
    UPDATE
ELSE
    INSERT

Saya baru saja muntah di mulut saya mengetik itu, tapi sebenarnya itu yang paling sering saya lihat.

Bagaimanapun, jika MERGEtidak fleksibel atau cukup kuat untuk Anda, saya sarankan Anda mengirimkan permintaan fitur ke Microsoft di http://connect.microsoft.com/sql/ dan menjelaskan, secara menyeluruh, kasus bisnis Anda. Selama Anda tetap menggunakan keuntungan nyata dari sintaks yang Anda usulkan MERGE, Anda mendapat suara saya. Jika Anda menggantung terlalu banyak pada bagian "rawan kesalahan", saya cenderung tidak akan membeli. Mengapa? Karena Anda bisa gemuk-pernyataan apa pun.

Yang mengatakan, saya tidak berpikir ada yang bisa dilakukan orang di sini untuk Anda secara khusus. Anda harus menyelidiki potensi masalah dengan MERGE:

http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

Aaron Bertrand
sumber
2
Terima kasih Aaron. Saya melihat melalui dokumentasi T-SQL pada MSDN dan tidak dapat menemukan apa yang saya cari; hanya berpikir saya akan membuangnya di sana kalau-kalau saya melewatkan sesuatu. Walaupun pernyataan MERGE masuk akal dalam situasi tertentu, saya merasa bahwa itu adalah solusi "palu godam untuk menumbuk paku" untuk operasi penyelamatan yang sederhana. Mungkin saya harus mengambil topi programmer saya, dan memakai DBA Fedora saya. Terima kasih telah meluangkan waktu untuk membagikan pemikiran Anda.
Pressacco