Tôi đã tự hỏi nếu bạn đã gặp một lệnh T-SQL tương tự như khái niệm về UPSERT? Việc thực hiện các thao tác INSERT | UPDATE bằng các tùy chọn (1) hoặc (2) dường như quá phức tạp và dễ bị lỗi.
MỤC TIÊU
Để đảm bảo rằng bản ghi mong muốn (trong trường hợp này là worker_id 1) được cập nhật mà KHÔNG cần phải viết cùng một truy vấn hai lần.
BỐI CẢNH
- tên bảng: nhân viên
- id nhân viên: có khóa chính và proerty nhận dạng được đặt thành đúng
LỰA CHỌN
thực thi SQL CẬP NHẬT ... kiểm tra @@ rowcount = 0 và @@ error = 0 ... thực thi SQL INSERT nếu được yêu cầu
- con: bạn thực sự phải viết cùng một truy vấn hai lần, một lần như một lần chèn, một lần như một lần cập nhật
- con: thêm mã = thêm thời gian gõ
- con: thêm mã = nhiều chỗ hơn cho lỗi
/programming/1106717/how-to-im vây-a-điều kiện-upsert-stored-products "Cập nhật bằng cách sử dụng @@ rowcount"
- thực thi SQL MERGE
- con: bạn thực sự phải viết cùng một truy vấn hai lần, một lần như một lần chèn, một lần như một lần cập nhật
- con: thêm mã = thêm thời gian gõ
- con: thêm mã = nhiều chỗ hơn cho lỗi
http://technet.microsoft.com/en-us/l Library / bb510625.aspx "Hợp nhất T-SQL"
- thực thi SQL UPSERT (tính năng không tồn tại)
- pro: bạn xác định mối quan hệ dữ liệu với bảng một lần (hãy để SQL Server lo lắng về việc đó có phải là CHERTN hay CẬP NHẬT)
- pro: ít mã = thực hiện nhanh hơn
- pro: ít mã = xác suất thấp hơn
VÍ DỤ
Nhân viên của UPSERT (worker_id, worker_number, job_title, First_name, middle_name, họ, đã sửa đổi_at)
- nếu worker_id 1 không tồn tại: MS SQL thực thi câu lệnh INSERT
- if worker_id 1 tồn tại: MS SQL thực thi và câu lệnh CẬP NHẬT
MERGE
đơn giản, linh hoạt và nó cũng là một phần của Tiêu chuẩn SQL. Vấn đề thực sự với MERGE
và các UPSERT
triển khai khác là leo thang khóa tiềm năng hoặc thậm chí là bế tắc không liên quan gì đến cú pháp.
MERGE
việc triển khai trong SQL Server.