2015-10-17 128 views
0

我正在使用SQL Server 2012/T-SQL,特別是Management Studio。如何在同一更新查詢中多次更新同一記錄?

我提供了一個表(我們稱之爲trackingInfo),它看起來是這樣的:

po_no tracking_no 
1  ABC 
2  DEF 
2  GHI 

我試圖給tracking_no數據插入表(我們稱之爲

po_no notes 
1  #ABC 
2  #DEF, #GHI 

(請注意,我不能改變的結構要麼trackingInfo:以下列方式purchaseOrders中)我給出的數據或purchaseOrders表中我試圖插入信息。我僅限於上述結構。)

我有一個更新查詢,適用於數據集trackingInfo僅包含每個po_no(例如po_no 1)的單個tracking_no的實例。但是,如果每個po_no有多個tracking_no(比如上面的po_no 2),則我正在使用的更新查詢無法附加第二個tracking_no值。此更新查詢位於底部。

我對解決方案的搜索表明,我在同一更新查詢中多次更新相同記錄的純限制運行。但是,我找不到比以下更不明顯的替代方案或解決方案。是否有一種相對簡單的方法在同一更新中多次更新相同的記錄/字段?

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 
; 

回答

1

你並不需要在UPDATE查詢更多更新一次相同的記錄。這可以通過使用XML進行基於集合的操作來實現級聯:

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, ''); 
+0

但是,您正在傳遞硬編碼的1,2值嗎?如何避免它? – DevelopmentIsMyPassion

+0

@DevelopmentIsMyPassion,數據值不是硬編碼的。查詢中的文字「1和2」是「STUFF」函數的起始位置和長度參數。此函數從連接字符串的開始處刪除前導逗號和空格。 –

+0

真的很棒。我不知道 – DevelopmentIsMyPassion

相關問題