如何使用插入/更新而不是在存储过程中合并来实现增量加载?

时间:2016-09-07 08:57:30

标签: sql-server tsql

我已经使用merge实现了增量加载,但我想使用insert / update。请帮忙。

这是merge方法的存储过程。下面的存储过程仅在插入新记录时从源加载数据,否则将丢弃。仅在记录中有更新时才更新。

ALTER PROCEDURE [dbo].[LOAD_DIM_ADDRESS]
AS
BEGIN 
    MERGE [VINCE_RETAIL_TEST].[dbo].[DIM_ADDRESS] AS T
    USING (SELECT 
               '1' as [COMPANY_KEY],
               C.[CUSTOMER_KEY],
               A.[ADDRESS_ID], A.[ADDRESS_TYPE],
               '0' as [REGION_KEY],
               '-1' as [COUNTRY_KEY],
               '-1' as [STATE_KEY],
               A.[CITY], A.[POSTAL_CODE]      
           FROM 
               [AX_STAGING].[dbo].[DIM_ADDRESS] A 
           INNER JOIN 
               [VINCE_RETAIL_TEST].[dbo].[DIM_CUSTOMER] C ON C.[CUSTOMER_ID] = A.[CUSTOMER_ID] 
                                                          AND C.[ADDRESS_ID] = A.[ADDRESS_ID]) AS S
    ON (T.[ADDRESS_ID] = S.[ADDRESS_ID] AND T.[ADDRESS_TYPE]=S.[ADDRESS_TYPE])

WHEN MATCHED
    THEN
        UPDATE
        SET 
           T.[COMPANY_KEY] = S.[COMPANY_KEY],
           T.[CUSTOMER_KEY] = S.[CUSTOMER_KEY],
           T.[ADDRESS_ID] = S.[ADDRESS_ID],
           T.[ADDRESS_TYPE] = S.[ADDRESS_TYPE], 
           T.[REGION_KEY] = S.[REGION_KEY],
           T.[COUNTRY_KEY] = S.[COUNTRY_KEY],
           T.[STATE_KEY] = S.[STATE_KEY],
           T.[CITY] = S.[CITY],
           T.[POSTAL_CODE] = S.[POSTAL_CODE]

 WHEN NOT MATCHED BY TARGET
    THEN
        INSERT ([COMPANY_KEY], [CUSTOMER_KEY], [ADDRESS_ID], [ADDRESS_TYPE],
                [REGION_KEY], [COUNTRY_KEY], [STATE_KEY], [CITY],
                [POSTAL_CODE])
        VALUES (S.[COMPANY_KEY], S.[CUSTOMER_KEY], S.[ADDRESS_ID], S.[ADDRESS_TYPE],
                S.[REGION_KEY], S.[COUNTRY_KEY], S.[STATE_KEY], S.[CITY],
                S.[POSTAL_CODE]);
  END

提前致谢

1 个答案:

答案 0 :(得分:1)

您需要区分何时使用INSERT,何时使用UPDATE。因此,例如,仅当目标表中不存在(S.[ADDRESS_ID], S.[ADDRESS_TYPE])时,才执行INSERT。代码已列出。同样,您可以将UPDATE部分编写为练习。 :)

INSERT  [VINCE_RETAIL_TEST].[dbo].[DIM_ADDRESS] 
               ([COMPANY_KEY], [CUSTOMER_KEY], [ADDRESS_ID], [ADDRESS_TYPE],
                [REGION_KEY], [COUNTRY_KEY], [STATE_KEY], [CITY],
                [POSTAL_CODE])
SELECT  S.[COMPANY_KEY], S.[CUSTOMER_KEY], S.[ADDRESS_ID], S.[ADDRESS_TYPE],
        S.[REGION_KEY], S.[COUNTRY_KEY], S.[STATE_KEY], S.[CITY],
        S.[POSTAL_CODE]
FROM    (SELECT 
               '1' as [COMPANY_KEY],
               C.[CUSTOMER_KEY],
               A.[ADDRESS_ID], A.[ADDRESS_TYPE],
               '0' as [REGION_KEY],
               '-1' as [COUNTRY_KEY],
               '-1' as [STATE_KEY],
               A.[CITY], A.[POSTAL_CODE]      
        FROM 
               [AX_STAGING].[dbo].[DIM_ADDRESS] A 
        INNER JOIN 
               [VINCE_RETAIL_TEST].[dbo].[DIM_CUSTOMER] C ON C.[CUSTOMER_ID] = A.[CUSTOMER_ID] 
                                                          AND C.[ADDRESS_ID] = A.[ADDRESS_ID]) AS S
WHERE   (S.[ADDRESS_ID], S.[ADDRESS_TYPE]) NOT IN (SELECT [ADDRESS_ID],[ADDRESS_TYPE] FROM [VINCE_RETAIL_TEST].[dbo].[DIM_ADDRESS])