2013-08-22 87 views
0

我有兩個具有相同結構的表。一個是臨時表,一個是主表。表名分別爲PurchaseOrders_TEMP和PurchaseOrders。每天我都用新數據刷新臨時表並運行PROC以更新和/或添加更新主表。我意識到,如果PO上的PO和/或項目被完全刪除,我就會遇到問題。我的proc不更新不在Temp表中的行。這是PurchaseOrders的表定義。我需要一個新的PROC或對此PROC的更新,當它不存在於TEMP表中時,它會將PBSTAT更改爲PBPO/PBITEM的「X」。使用Proc將值從一個表更新到另一個表

[dbo].[PurchaseOrders](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [PBPO] [int] NOT NULL, 
    [PBSEQ] [int] NOT NULL, 
    [PBITEM] [varchar](28) NOT NULL, 
    [PBDEL] [varchar](1) NULL, 
    [PBVEND] [varchar](9) NULL, 
    [PBTYPE] [varchar](1) NULL, 
    [PBLOC] [varchar](4) NULL, 
    [PBDSC1] [varchar](51) NULL, 
    [PBDSC2] [varchar](45) NULL, 
    [PBPDTE] [datetime] NULL, 
    [PBDUE] [datetime] NULL, 
    [XDPRVDT] [datetime] NULL, 
    [XDCURDT] [datetime] NULL, 
    [PBRDTE] [datetime] NULL, 
    [PBOQTY] [int] NULL, 
    [PBTQTY] [int] NULL, 
    [PBRQTY] [int] NULL, 
    [PBDQTY] [int] NULL, 
    [PBLQTY] [int] NULL, 
    [PBBQTY] [int] NULL, 
    [PBCOST] [float] NULL, 
    [EXTCOST] [float] NULL, 
    [PBCCTD] [datetime] NULL, 
    [PBCCTT] [int] NULL, 
    [PBCCTU] [varchar](15) NULL, 
    [PBLCGD] [datetime] NULL, 
    [PBLCGT] [int] NULL, 
    [PBUSER] [varchar](12) NULL, 
    [PASTAT] [varchar](1) NULL, 
    [PABUYR] [varchar](3) NULL, 
    [PAPAD3] [varchar](45) NULL, 
    [PAPPHN] [varchar](30) NULL, 
    [PACONF] [varchar](39) NULL, 
    [Comment] [varchar](max) NULL 

這裏是我運行更新數據的當前Proc。

ALTER PROCEDURE [dbo].[UpdateExistingPurchaseOrders] 
AS 
BEGIN 
SET NOCOUNT ON; 

UPDATE 
    p 
SET 
    p.PBDEL = pt.PBDEL, 
    p.PBVEND = pt.PBVEND, 
    p.PBTYPE = pt.PBTYPE, 
    p.PBLOC = pt.PBLOC, 
    p.PBDSC1 = pt.PBDSC1, 
    p.PBDSC2 = pt.PBDSC2, 
    p.PBPDTE = pt.PBPDTE, 
    p.PBDUE = pt.PBDUE, 
    p.PBRDTE = pt.PBRDTE, 
    p.PBOQTY = pt.PBOQTY, 
    p.PBTQTY = pt.PBTQTY, 
    p.PBRQTY = pt.PBRQTY, 
    p.PBDQTY = pt.PBDQTY, 
    p.PBLQTY = pt.PBLQTY, 
    p.PBBQTY = pt.PBBQTY, 
    p.PBCOST = pt.PBCOST, 
    p.EXTCOST = pt.EXTCOST, 
    p.PBCCTD = pt.PBCCTD, 
    p.PBCCTT = pt.PBCCTT, 
    p.PBCCTU = pt.PBCCTU, 
    p.PBLCGD = pt.PBLCGD, 
    p.PBLCGT = pt.PBLCGT, 
    p.PBUSER = pt.PBUSER, 
    p.PASTAT = pt.PASTAT, 
    p.PABUYR = pt.PABUYR, 
    p.PAPAD3 = pt.PAPAD3, 
    p.PAPPHN = pt.PAPPHN, 
    p.PACONF = pt.PACONF 
FROM 
    dbo.PurchaseOrders_TEMP pt 
    LEFT OUTER JOIN dbo.PurchaseOrders p 
     ON p.PBPO = pt.PBPO 
     AND p.PBSEQ = pt.PBSEQ 
WHERE 
    p.PBPO IS NOT NULL 
    AND p.PBSEQ IS NOT NULL 

END 

回答

1

您可以使用MERGE語句從源查詢中的數據修改目標表中的數據。文檔中的前兩個示例顯示瞭如何根據是否找到源行來插入/更新或更新/刪除。

在你的情況,你會寫這樣的事:

MERGE dbo.PurchaseOrders AS target 
USING (SELECT ... FROM PurchaseOrders_TEMP) AS source (...) 
ON (ON target.PBPO = source.PBPO 
    AND target.PBSEQ = source.PBSEQ) 
WHEN NOT MATCHED BY SOURCE 
    THEN DELETE 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT (....) 
     VALUES (....) 
WHEN MATCHED 
    THEN UPDATE 
    SET ... 
+0

我不想刪除任何的PurchaseOrders表中的歷史記錄。當PBPO和/或PBSEQ/PBITEM不存在於新數據中時,我只想將字段PASTAT的值更改爲'X'。 – tsqln00b

+0

然後寫一個UPDATE語句而不是DELETE –

+0

其他人有辦法做到這一點? – tsqln00b

0

這裏是我想出了答案......

UPDATE 
    p 
SET 
    p.PASTAT = 'X' 
FROM 
    dbo.PurchaseOrders_TEMP pt   
    LEFT JOIN dbo.PurchaseOrders p ON 
     p.PBPO = pt.PBPO 
     AND p.PBSEQ = pt.PBSEQ 
WHERE 
    pt.PBPO IS NULL 
    AND pt.PBSEQ IS NULL 
    AND p.PASTAT <> 'X' 
END 
相關問題