Wie kann ich denselben datasatz mehr als einmal in der gleichen Update-Abfrage aktualisieren?

Ich verwende SQL server 2012 / T-SQL, speziell Management Studio.

Ich bin mit einem Tisch versehen (wir nennen es trackingInfo ) das sieht so aus:

po_no tracking_no 1 ABC 2 DEF 2 GHI 

Ich versuche, die tracking_no data in eine Tabelle einzufügen (wir nennen es buyOrders ) auf folgende Weise:

 po_no notes 1 #ABC 2 #DEF, #GHI 

(Bitte beachten Sie, dass ich die Struktur der TrackingInfo- data, die ich gegeben habe, nicht ändern kann oder die buyOrders- Tabelle, in der ich versuche, die Informationen einzufügen. Ich bin auf die oben genannten Strukturen beschränkt.)

Ich habe eine Update-Abfrage, die perfekt für Instanzen funktioniert, in denen das Dataset trackingInfo nur ein einziges tracking_no pro po_no enthält (zB po_no 1). In Fällen, in denen es mehr als eine tracking_no pro po_no gibt (wie oben mit po_no 2), fügt die Update-Abfrage, die ich verwende, den zweiten Tracking_no-Wert nicht an. Diese Update-Abfrage ist unten.

Meine search nach einer Lösung würde darauf hindeuten, dass ich gegen eine reine Einschränkung der Aktualisierung der gleichen Aufzeichnung mehr als einmal in der gleichen Update-Abfrage laufen. Allerdings kann ich keine Alternative oder Lösung finden, die nicht wesentlich stumpfer ist als die unten. Gibt es eine relativ einfache Möglichkeit, den gleichen datasatz / Feld mehr als einmal in der gleichen Aktualisierung zu aktualisieren?

 UPDATE purchaseOrders SET purchaseOrders.notes = CASE WHEN CHARINDEX(trackingInfo.tracking_no,purchaseOrders.notes) > 0 THEN purchaseOrders.notes -- If tracking_no is already in notes, don't insert it. WHEN len(purchaseOrders.notes) = 0 OR purchaseOrders.notes IS NULL THEN '#' + trackingInfo.tracking_no -- If notes is empty, insert the tracking_no. ELSE purchaseOrders.notes + ', #' + trackingInfo.tracking_no -- If something is in notes, but it's not the tracking_no, then append the tracking_no. END FROM purchaseOrders INNER JOIN trackingInfo ON purchaseOrders.po_no = trackingInfo.po_no ; 

Sie müssen denselben datasatz nicht mehr einmal in der UPDATE Abfrage aktualisieren. Dies kann als set-basierte Operation mit XML durchgeführt werden, um die Verkettung zu erleichtern:

 CREATE TABLE dbo.trackingInfo( po_no int NOT NULL , tracking_no varchar(10) NOT NULL ); CREATE TABLE dbo.purchaseOrders( po_no int NOT NULL , notes varchar(MAX) NULL ); INSERT INTO dbo.trackingInfo VALUES (1, 'ABC') , (2, 'DEF') , (2, 'GHI'); INSERT INTO dbo.purchaseOrders (po_no) VALUES (1) , (2); UPDATE dbo.purchaseOrders SET notes = STUFF(( SELECT ', #' + tracking_no FROM dbo.trackingInfo AS ti WHERE ti.po_no = purchaseOrders.po_no FOR XML PATH('') ), 1, 2, '');