ฉันกำลังพยายามอัปเดตตารางด้วยอาร์เรย์ของค่าต่างๆ แต่ละรายการในอาร์เรย์มีข้อมูลที่ตรงกับแถวในตารางในฐานข้อมูล SQL Server หากแถวนั้นมีอยู่แล้วในตารางเราจะอัปเดตแถวนั้นด้วยข้อมูลในอาร์เรย์ที่กำหนด มิฉะนั้นเราจะแทรกแถวใหม่ในตาราง ฉันได้อธิบายโดยทั่วไปเพิ่มขึ้น
ตอนนี้ฉันกำลังพยายามทำให้สำเร็จในโพรซีเดอร์ที่เก็บไว้ซึ่งใช้พารามิเตอร์ XML เหตุผลที่ฉันใช้ XML และไม่ใช่พารามิเตอร์ที่มีค่าเป็นตารางเนื่องจากฉันจะต้องสร้างประเภทที่กำหนดเองใน SQL และเชื่อมโยงประเภทนี้กับกระบวนงานที่เก็บไว้ หากฉันเปลี่ยนบางสิ่งบางอย่างในขั้นตอนการจัดเก็บหรือ db schema ของฉันลงที่ถนนฉันจะต้องทำซ้ำทั้งขั้นตอนการจัดเก็บและประเภทที่กำหนดเอง ฉันต้องการหลีกเลี่ยงสถานการณ์นี้ นอกจากนี้ความเหนือกว่าที่ TVP มีเหนือ XML ไม่มีประโยชน์สำหรับสถานการณ์ของฉันเพราะขนาดอาร์เรย์ข้อมูลของฉันจะไม่เกิน 1,000 ซึ่งหมายความว่าฉันไม่สามารถใช้โซลูชันที่เสนอที่นี่: วิธีแทรกหลายระเบียนโดยใช้ XML ใน SQL Server 2008
นอกจากนี้ยังมีการอภิปรายที่คล้ายกันที่นี่ ( UPSERT - มีทางเลือกที่ดีกว่าสำหรับ MERGE หรือ @@ rowcount หรือไม่ ) แตกต่างจากที่ฉันขอเพราะฉันพยายามเพิ่มหลายแถวไปยังตาราง
ฉันหวังว่าฉันจะใช้ชุดคำสั่งต่อไปนี้เพื่อเพิ่มค่าจาก xml แต่นี่จะไม่ทำงาน วิธีการนี้ควรทำงานเมื่ออินพุตเป็นแถวเดียว
begin tran
update table with (serializable) set select * from xml_param
where key = @key
if @@rowcount = 0
begin
insert table (key, ...) values (@key,..)
end
commit tran
ทางเลือกถัดไปคือการใช้ IF EXISTS แบบละเอียดหรือแบบใดแบบหนึ่งของแบบฟอร์มต่อไปนี้ แต่ฉันปฏิเสธสิ่งนี้บนพื้นฐานของการมีประสิทธิภาพที่ดีที่สุดย่อย:
IF (SELECT COUNT ... ) > 0
UPDATE
ELSE
INSERT
ตัวเลือกต่อไปคือการใช้คำสั่งผสานตามที่อธิบายไว้ที่นี่: http://www.databasejournal.com/features/mssql/using-the-merge-statement-to-perform-an-upsert.html แต่แล้วผมอ่านเกี่ยวกับปัญหาเกี่ยวกับแบบสอบถามผสานนี่: http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/ ด้วยเหตุนี้ฉันจึงพยายามหลีกเลี่ยงการรวม
ดังนั้นตอนนี้คำถามของฉันคือ: มีตัวเลือกอื่นหรือวิธีที่ดีกว่าเพื่อให้บรรลุหลาย upsert โดยใช้พารามิเตอร์ XML ใน SQL Server 2008 เก็บขั้นตอนหรือไม่
โปรดทราบว่าข้อมูลในพารามิเตอร์ XML อาจมีบางระเบียนที่ไม่ควรเป็น UPSERTed เนื่องจากมีอายุมากกว่าระเบียนปัจจุบัน มีModifiedDate
ฟิลด์ในทั้ง XML และตารางปลายทางที่ต้องเปรียบเทียบเพื่อพิจารณาว่าควรอัปเดตหรือทิ้งเรคคอร์ดหรือไม่
MERGE
เบอร์แทรนด์ชี้ให้เห็นว่าส่วนใหญ่เป็นคดีและความไร้ประสิทธิภาพไม่แสดง stoppers - MS คงไม่ปล่อยถ้ามันเป็นเขตทุ่นระเบิดที่แท้จริง คุณแน่ใจหรือไม่ว่าการโน้มน้าวใจที่คุณกำลังเผชิญเพื่อหลีกเลี่ยงMERGE
ไม่ได้สร้างข้อผิดพลาดที่อาจเกิดขึ้นได้มากกว่าการประหยัด?
MERGE
เป็นธรรมสิ่งที่ผมเสนอไม่ได้จริงๆที่ซับซ้อนเมื่อเทียบกับ ขั้นตอน INSERT และ UPDATE ของ MERGE ยังคงดำเนินการแยกกัน ข้อแตกต่างที่สำคัญในแนวทางของฉันคือตัวแปรตารางที่เก็บ ID เร็กคอร์ดที่อัพเดตและเคียวรี DELETE ที่ใช้ตัวแปรตารางนั้นเพื่อลบเร็กคอร์ดเหล่านั้นออกจากตาราง temp ของข้อมูลขาเข้า และฉันคิดว่าแหล่งที่มาอาจถูกส่งโดยตรงจาก @ XMLparam.nodes () แทนที่จะทิ้งลงในตารางชั่วคราว แต่ถึงกระนั้นก็ยังไม่มีอะไรพิเศษอีกมากที่ไม่ต้องกังวลเกี่ยวกับการค้นพบตัวเองในกรณีขอบเหล่านั้น - )