0

同じ構造のテーブルが 2 つあります。1 つは一時テーブルで、もう 1 つはメイン テーブルです。テーブル名は、それぞれ PurchaseOrders_TEMP と PurchaseOrders です。毎日、一時テーブルを新しいデータで更新し、PROC を実行して、変更や追加でメイン テーブルを更新します。PO および/または PO のアイテムが完全に削除された場合に問題があることに気付きました。proc が一時テーブルにない行を更新していません。PurchaseOrders のテーブル定義は次のとおりです。TEMP テーブルに存在しない場合に PBPO/PBITEM の PBSTAT を「X」に変更する、新しい PROC またはこの 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
4

2 に答える 2

1

MERGEステートメントを使用して、ソース クエリのデータからターゲット テーブルのデータを変更できます。ドキュメントの最初の 2 つの例は、ソース行が見つかったかどうかに応じて挿入/更新または更新/削除する方法を示しています。

あなたの場合、次のように書く必要があります。

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 ...
于 2013-08-22T14:37:03.597 に答える
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
于 2013-08-23T13:16:56.593 に答える