คำถามติดแท็ก merge

1
รวมส่วนย่อยของตารางเป้าหมาย
ฉันกำลังพยายามใช้MERGEคำสั่งเพื่อแทรกหรือลบแถวออกจากตาราง แต่ฉันต้องการดำเนินการกับชุดย่อยของแถวเหล่านั้นเท่านั้น เอกสารสำหรับMERGEคำเตือนที่มีคำพูดค่อนข้างแรง: สิ่งสำคัญคือต้องระบุเฉพาะคอลัมน์จากตารางเป้าหมายที่ใช้สำหรับจุดประสงค์ที่ตรงกัน นั่นคือระบุคอลัมน์จากตารางเป้าหมายที่เปรียบเทียบกับคอลัมน์ที่เกี่ยวข้องของตารางต้นฉบับ อย่าพยายามปรับปรุงประสิทธิภาพการสืบค้นด้วยการกรองแถวในตารางเป้าหมายในส่วนคำสั่ง ON เช่นโดยระบุ AND NOT target_table.column_x = value การทำเช่นนั้นอาจส่งคืนผลลัพธ์ที่ไม่คาดคิดและไม่ถูกต้อง แต่นี่คือสิ่งที่ฉันต้องทำเพื่อให้MERGEงานของฉันปรากฏ ข้อมูลที่ฉันมีคือตารางการเข้าร่วมหลายต่อหลายมาตรฐานสำหรับหมวดหมู่ (เช่นรายการที่รวมอยู่ในหมวดหมู่ใด) ดังนี้: CategoryId ItemId ========== ====== 1 1 1 2 1 3 2 1 2 3 3 5 3 6 4 5 สิ่งที่ฉันต้องทำคือการแทนที่แถวทั้งหมดในหมวดหมู่เฉพาะด้วยรายการใหม่ ความพยายามครั้งแรกของฉันในการทำเช่นนี้ดูเหมือนว่า: MERGE INTO CategoryItem AS TARGET USING ( SELECT ItemId FROM …

2
วิธีแทรกหรืออัปเดตโดยใช้ข้อความค้นหาเดียว
ฉันมีตารางทดสอบที่มีคอลัมน์ id ซึ่งเป็นคีย์หลักและเพิ่มขึ้นอัตโนมัติและชื่อ ฉันต้องการที่จะแทรกบันทึกใหม่ถ้า annd เฉพาะในกรณีที่ไม่มีบันทึกตัวอย่างเช่น อินพุตคือ id = 30122 และ name = john หากมีการบันทึกที่มี id 30122 ฉันได้อัปเดตคอลัมน์ชื่อเป็น john หากไม่มีการบันทึกฉันจะใส่บันทึกใหม่ ฉันสามารถทำได้โดยใช้ 2 แบบสอบถามเช่น select * from test where id=30122 หากมีบางบันทึกฉันสามารถใช้งานได้ update test set name='john' where id=3012 หรือถ้ามันไม่มีบันทึกฉันก็สามารถใช้งานได้ insert into test(name) values('john') แต่ฉันต้องการใช้ข้อความค้นหาเดียว? ใครสามารถบอกได้ถ้าเป็นไปได้?

1
เหตุใดคำสั่ง MERGE นี้จึงทำให้เซสชันถูกฆ่า
ฉันมีMERGEคำสั่งด้านล่างซึ่งออกกับฐานข้อมูล: MERGE "MySchema"."Point" AS t USING ( SELECT "ObjectId", "PointName", z."Id" AS "LocationId", i."Id" AS "Region" FROM @p1 AS d JOIN "MySchema"."Region" AS i ON i."Name" = d."Region" LEFT JOIN "MySchema"."Location" AS z ON z."Name" = d."Location" AND z."Region" = i."Id" ) AS s ON s."ObjectId" = t."ObjectId" WHEN NOT …

4
รวมคำสั่ง deadlocking ตัวเอง
ฉันมีขั้นตอนดังต่อไปนี้ (SQL Server 2008 R2): create procedure usp_SaveCompanyUserData @companyId bigint, @userId bigint, @dataTable tt_CoUserdata readonly as begin set nocount, xact_abort on; merge CompanyUser with (holdlock) as r using ( select @companyId as CompanyId, @userId as UserId, MyKey, MyValue from @dataTable) as newData on r.CompanyId = newData.CompanyId and r.UserId = newData.UserId …

1
ตัวเลือกการล็อคของฉันสำหรับคำสั่งผสานคืออะไร
ฉันมีขั้นตอนการจัดเก็บที่ดำเนินการคำสั่งMERGE ดูเหมือนว่าจะล็อกทั้งตารางตามค่าเริ่มต้นเมื่อดำเนินการผสาน ฉันกำลังเรียกขั้นตอนการจัดเก็บนี้ภายในธุรกรรมที่ฉันกำลังทำสิ่งอื่นอยู่ด้วยและฉันหวังว่ามันจะล็อคแถวที่ได้รับผลกระทบเท่านั้น ฉันลองคำใบ้MERGE INTO myTable WITH (READPAST)และดูเหมือนจะล็อคน้อยลง แต่มีคำเตือนในเอกสาร ms ที่บอกว่าสามารถแทรกคีย์ที่ซ้ำกันได้แม้จะข้ามคีย์หลัก นี่คือคีตารางของฉัน: CREATE TABLE StudentDetails ( StudentID INTEGER PRIMARY KEY, StudentName VARCHAR(15) ) GO INSERT INTO StudentDetails VALUES(1,'WANG') INSERT INTO StudentDetails VALUES(2,'JOHNSON') GO CREATE TABLE StudentTotalMarks ( Id INT IDENTITY PRIMARY KEY, StudentID INTEGER REFERENCES StudentDetails, StudentMarks INTEGER ) GO …

2
MERGE กับ OUTPUT ดีกว่า INSERT และ SELECT แบบมีเงื่อนไขหรือไม่?
เรามักจะพบกับสถานการณ์ "หากไม่มีอยู่แทรก" บล็อกของ Dan Guzmanมีการตรวจสอบที่ยอดเยี่ยมเกี่ยวกับวิธีทำให้เธรดกระบวนการนี้ปลอดภัย SEQUENCEผมมีตารางพื้นฐานที่เพียงแคตตาล็อกสตริงจำนวนเต็มจากที่ ในกระบวนงานที่เก็บไว้ฉันต้องได้รับคีย์จำนวนเต็มสำหรับค่าหากมีอยู่หรือINSERTจากนั้นรับค่าผลลัพธ์ มีข้อ จำกัด ที่ไม่ซ้ำกันในdbo.NameLookup.ItemNameคอลัมน์ดังนั้นความถูกต้องของข้อมูลจึงไม่มีความเสี่ยง แต่ฉันไม่ต้องการพบข้อยกเว้น มันไม่ใช่IDENTITYดังนั้นฉันไม่สามารถรับSCOPE_IDENTITYและคุณค่าอาจเป็นNULLในบางกรณี ในสถานการณ์ของฉันฉันต้องจัดการกับINSERTความปลอดภัยบนโต๊ะเท่านั้นดังนั้นฉันจึงพยายามตัดสินใจว่าควรใช้MERGEแบบนี้ดีกว่า: SET NOCOUNT, XACT_ABORT ON; DECLARE @vValueId INT DECLARE @inserted AS TABLE (Id INT NOT NULL) MERGE dbo.NameLookup WITH (HOLDLOCK) AS f USING (SELECT @vName AS val WHERE @vName IS NOT NULL AND LEN(@vName) > 0) AS new_item …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.