ฉันสงสัยว่าถ้าคุณพบคำสั่ง T-SQL ซึ่งคล้ายกับแนวคิดของ UPSERT หรือไม่ การดำเนินการ INSERT | UPDATE โดยใช้ตัวเลือก (1) หรือ (2) ดูเหมือนซับซ้อนและมีข้อผิดพลาดมากเกินไป
วัตถุประสงค์
เพื่อให้แน่ใจว่าระเบียนที่ต้องการ (ในกรณีนี้ employee_id 1) เป็นข้อมูลล่าสุดโดยไม่จำเป็นต้องเขียนคำถามเดียวกันสองครั้ง
บริบท
- ชื่อตาราง: ลูกจ้าง
- รหัสพนักงาน: มีคีย์หลักและตั้งค่าความเป็นตัวตนเป็นจริง
ตัวเลือก
เรียกใช้ SQL UPDATE ... ตรวจสอบ @@ rowcount = 0 และ @@ error = 0 ... เรียกใช้ SQL INSERT หากจำเป็น
- คอนดิชั่น: คุณต้องเขียนคำถามเดียวกันสองครั้งครั้งเดียวเป็นการแทรกครั้งเดียวเป็นการอัปเดต
- con: รหัสเพิ่มเติม = พิมพ์เวลามากขึ้น
- con: รหัสเพิ่มเติม = ห้องเพิ่มเติมสำหรับข้อผิดพลาด
/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure "อัปเดตโดยใช้ @@ rowcount"
- รัน SQL MERGE
- คอนดิชั่น: คุณต้องเขียนคำถามเดียวกันสองครั้งครั้งเดียวเป็นการแทรกครั้งเดียวเป็นการอัปเดต
- con: รหัสเพิ่มเติม = พิมพ์เวลามากขึ้น
- con: รหัสเพิ่มเติม = ห้องเพิ่มเติมสำหรับข้อผิดพลาด
http://technet.microsoft.com/en-us/library/bb510625.aspx "T-SQL Merge"
- ดำเนินการ SQL UPSERT (ไม่มีคุณสมบัติ)
- Pro: คุณกำหนดความสัมพันธ์ data-to-table หนึ่งครั้ง (ปล่อยให้ SQL Server กังวลว่าเป็น INSERT หรือ UPDATE หรือไม่)
- โปร: รหัสน้อย = การใช้งานได้เร็วขึ้น
- โปร: รหัสน้อย = ความน่าจะเป็นที่ต่ำกว่า
ตัวอย่างของ UPSERT
พนักงานของ UPSERT (employee_id, employee_number, job_title, ชื่อแรก, ชื่อกลาง, ชื่อกลาง, modified_at) ค่านิยม (1, '00 -124AB37 ',' ผู้จัดการ ',' John ',' T ',' Smith ', GetDate ());
- ถ้า employee_id 1 ไม่มีอยู่: MS SQL ดำเนินการคำสั่ง INSERT
- ถ้า employee_id 1 มีอยู่: MS SQL จะดำเนินการและคำสั่ง UPDATE
MERGE
ตรงไปตรงมายืดหยุ่นและเป็นส่วนหนึ่งของ SQL Standard ปัญหาที่แท้จริงของการใช้งานMERGE
และอื่น ๆUPSERT
คือการเพิ่มการล็อคที่อาจเกิดขึ้นหรือแม้แต่การหยุดชะงักซึ่งไม่มีส่วนเกี่ยวข้องกับไวยากรณ์
MERGE
การใช้งานใน SQL Server