2009-02-26 21 views
2

私は処方箋薬情報を保存しているテーブルを持っており、毎日中央処方箋から更新する必要があります。一時表は薬物表と同じです。一時テーブルのデータは、メインテーブルと同一(またはほとんどの日)になる可能性があります。または、更新された行または新しい行を持つ可能性があります。一時テーブルからテーブルを更新

Iは、メインテーブルを更新するストアドプロシージャを持っているが、(新しい行を一時テーブルに存在する場合)、それはNULL行を更新しないので、それは失敗します。

これは、私がここで間違っているつもりですMSSQL Server 2005の

です:

-- Insert statements for procedure here 
UPDATE [RX_Billing].[dbo].[FS_Drug] 
SET [TRADENAME] = [RX_Billing].[dbo].[FS_Drug_TEMP].[TRADENAME] 
    ,[CDM] = [RX_Billing].[dbo].[FS_Drug_TEMP].[CDM] 
    ,[NDC] = [RX_Billing].[dbo].[FS_Drug_TEMP].[NDC] 
    ,[IP_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[IP_COST] 
    ,[OP_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[OP_COST] 
    ,[HH_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[HH_COST] 
    ,[VAR_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[VAR_COST] 
    ,[LSTUPDATE] = [RX_Billing].[dbo].[FS_Drug_TEMP].[LSTUPDATE] 
FROM [RX_Billing].[dbo].[FS_Drug] 
RIGHT OUTER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] ON 
      [RX_Billing].[dbo].[FS_Drug].[TRADENAME] = 
        [RX_Billing].[dbo].[FS_Drug_TEMP].[TRADENAME] 

EDIT:

私はロリーのコードと一緒に行きました。ありがとう、それは美しく動作します。オリオンエドワーズへ

注:UPSERT/MERGEは、私が望んでいたまさにですが、それは、SQL Server 2005でサポートされていませんどうやらそれが計画されたが、そのリリースをしませんでした。それは

答えて

10

標準的な方法は、UPDATE、その後、INSERTを行うことです。これは、UPDATEと同じですが、LEFT OUTER JOINのtmp.TRADENAMEがNULLの別の文として行います。

2

では、新しい行のINSERT、および既存の行にUPDATEを行うにはしたくないでしょう(Interwebsが私に言ったもの。より)Server 2008で提供されていますか?これをINNER JOINに更新し、別のINSERTを追加すると、正しく理解できれば問題は解決します。

3

UPSERT(基本的には「存在する場合、更新する、そうでなければ挿入する」)を試すことができます。これ以上tmpにではありません薬ですべてのレコードを削除したとして

-- UPDATE rows using an INNER JOIN with matching TRADENAME. No need to update TRADENAME column. 
UPDATE drug 
SET [CDM] = tmp.[CDM] 
    , [NDC] = tmp.[NDC] 
    , [IP_COST] = tmp.[IP_COST] 
    , [OP_COST] = tmp.[OP_COST] 
    , [HH_COST] = tmp.[HH_COST] 
    , [VAR_COST] = tmp.[VAR_COST] 
    , [LSTUPDATE] = tmp.[LSTUPDATE] 
FROM [RX_Billing].[dbo].[FS_Drug] drug 
INNER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] tmp 
    ON drug.[TRADENAME] = tmp.[TRADENAME] 

-- Insert rows that don't have matching TRADENAME 
INSERT INTO drug 
SELECT 
    tmp.[TRADENAME] 
    , tmp.[CDM] 
    , tmp.[NDC] 
    , tmp.[IP_COST] 
    , tmp.[OP_COST] 
    , tmp.[HH_COST] 
    , tmp.[VAR_COST] 
    , tmp.[LSTUPDATE] 
FROM [RX_Billing].[dbo].[FS_Drug] drug 
RIGHT OUTER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] tmp 
    ON drug.[TRADENAME] = tmp.[TRADENAME] 
WHERE drug.[TRADENAME] IS NULL 

あなたはまた、削除することがありますかフラグ:

I believe SQL server calls it MERGE