2017-06-14 64 views
1

將記錄插入我們的ERP中,我需要檢查重複項。 PC是我們的企業資源規劃(ERP)。 GM是我們的客戶關係管理(CRM)PCB是我們用來同步ERP和CRM之間更新的橋樑。哪個更好?方法1或方法2T-SQL將記錄插入我們的ERP,檢查重複記錄

PC是我們的ERP, 通用汽車是我們的CRM, PCB是我們的橋

SQL服務器2008R

Method 1 
     IF New PCB.People_ID <> PC.PeopleID (1) --People_ID not Duplicate 
      IF -- Next Check Name 
     A. or PCB FIRST_NAME <> PC FIRST_NAME (2) 
     B. or PCB MIDDLE_NAME <> PC MIDDLE_NAME (2) 
     C. or PCB LAST_NAME <> PC LAST_NAME (2) 
      --Name Not Duplicate 
      IF PCB @TAX_ID <> PC @P_TAX_ID (3) --Next Check TAX_ID 
         --TAX_ID not Duplicate 
       Create New Record sp_insert_people (15) 
      Send PC.PeopleID to GM GM.U_KEY4 
        THEN 
          Send back the 99-SSN to GM Status (6) 
        ENDIF 
      THEN –Name is Duplicate 
       ABC Matching Names send 99-NAM to GM Status (5) 
      ENDIF 
     THEN --People_ID is Duplicate (7) 
      IF – Next Check Name 
     A. or PCB FIRST_NAME <> PC FIRST_NAME (2) 
     B. or PCB MIDDLE_NAME <> PC MIDDLE_NAME (2) 
     C. or PCB LAST_NAME <> PC LAST_NAME (2) 
      --Name not Duplicate 
      send 99-NAM to GM Status (14) 
     THEN 
      IF PCB @TAX_ID <> PC @P_TAX_ID (3) --Next Check TAX_ID 
          --TAX_ID not Duplicate 
          send back the 99-SSN to Status GM.KEY1 (13) 
        THEN --TAX_ID Was Not Duplicate 
          --Check Date of Birth 
       IF CG BIRTH_DATE <> PC P_BIRTH_DATE (10) 
        send back 99-DOB to GM Status Status GM.KEY1 (16) 
          THEN 
           Update Record sp_insert_people (11) 
          ENDIF –Date of Birth 
        ENDIF –TAX_ID 
     ENDIF 
      Record was not created or updated for some reason other than listed above send back 99-OTHER (17) To GM Status 
     ENDIF 

Method 2 

    -- Start Check Comparison People Information 
     DECLARE @p_list_people_changes TABLE(PEOPLE_ID VARCHAR(200)); 

     INSERT INTO @p_list_people_changes SELECT PEOPLE_ID FROM PEOPLECHANGES; --Some condition will add to reduce list 

     IF OBJECT_ID('tempdb..#TMP_LIST_PEOPLE_ACTION') IS NOT NULL 
     DROP TABLE #TMP_LIST_PEOPLE_ACTION; 

     CREATE TABLE #TMP_LIST_PEOPLE_ACTION 
     (
      PEOPLE_ID VARCHAR(200), 
      USTUSTATDT DATETIME, 
      RESPOND_CODE VARCHAR(20), 
      ACT CHAR(1) --I: INSERT, U: UPDATE, E: ERROR 
     ); 

     DECLARE @p_PEOPLE_ID VARCHAR(200); 
     SELECT TOP 1 @p_PEOPLE_ID = PEOPLE_ID FROM @p_list_people_changes; 

     IF OBJECT_ID('tempdb..#tmp_bridge_people_change') IS NOT NULL 
     DROP TABLE #tmp_bridge_people_change; 
     SELECT t.* INTO #tmp_bridge_people_change FROM PEOPLECHANGES t 
     INNER JOIN 
     (SELECT PEOPLE_ID, MAX(USTUSTATDT) USTUSTATDT FROM PEOPLECHANGES 
     GROUP BY PEOPLE_ID) t1 ON t.PEOPLE_ID = t1.PEOPLE_ID AND t.USTUSTATDT = t1.USTUSTATDT 
     ; 

     IF OBJECT_ID('tempdb..#tmp_powercampus_people') IS NOT NULL 
     DROP TABLE #tmp_powercampus_people; 
     SELECT * INTO #tmp_powercampus_people FROM PC.dbo.PEOPLE; 


     --Get list of new People 
     INSERT INTO #TMP_LIST_PEOPLE_ACTION (PEOPLE_ID, USTUSTATDT, RESPOND_CODE, ACT) 
     SELECT br.PEOPLE_ID, br.USTUSTATDT, NULL, 'I' FROM #tmp_bridge_people_change br 
     LEFT JOIN #tmp_powercampus_people pw ON br.PEOPLE_ID = pw.PEOPLE_ID 
     WHERE pw.PEOPLE_ID IS NULL; 

     --Get list of update/error People 
     INSERT INTO #TMP_LIST_PEOPLE_ACTION (PEOPLE_ID, USTUSTATDT, RESPOND_CODE, ACT) 
     SELECT br.PEOPLE_ID, br.USTUSTATDT, 
     CASE 
       WHEN (br.FIRST_NAME = pw.FIRST_NAME AND br.MIDDLE_NAME = pw.MIDDLE_NAME AND br.LAST_NAME = pw.LAST_NAME) 
        AND (br.TAX_ID = pw.TAX_ID) 
        AND (br.BIRTH_DATE = pw.BIRTH_DATE) 
       THEN 
        NULL 
       ELSE 
        CASE WHEN (br.FIRST_NAME <> pw.FIRST_NAME OR br.MIDDLE_NAME <> pw.MIDDLE_NAME OR br.LAST_NAME <> pw.LAST_NAME) 
         THEN '99-NAM' 
         WHEN (br.FIRST_NAME = pw.FIRST_NAME AND br.MIDDLE_NAME = pw.MIDDLE_NAME AND br.LAST_NAME = pw.LAST_NAME) 
           AND (br.TAX_ID <> pw.TAX_ID) 
         THEN '99-SSN' 
         WHEN (br.FIRST_NAME = pw.FIRST_NAME AND br.MIDDLE_NAME = pw.MIDDLE_NAME AND br.LAST_NAME = pw.LAST_NAME) 
           AND (br.TAX_ID = pw.TAX_ID) 
           AND (br.BIRTH_DATE <> pw.BIRTH_DATE) 
         THEN '99-DOB' 
         END 
      END RESPOND_CODE, 
      CASE 
       WHEN (br.FIRST_NAME = pw.FIRST_NAME AND br.MIDDLE_NAME = pw.MIDDLE_NAME AND br.LAST_NAME = pw.LAST_NAME) 
        AND (br.TAX_ID = pw.TAX_ID) 
        AND (br.BIRTH_DATE = pw.BIRTH_DATE) 
       THEN 
        'U' 
       ELSE 
        CASE WHEN NOT(br.FIRST_NAME <> pw.FIRST_NAME OR br.MIDDLE_NAME <> pw.MIDDLE_NAME OR br.LAST_NAME <> pw.LAST_NAME) 
         THEN 'E' 
         WHEN NOT((br.FIRST_NAME <> pw.FIRST_NAME OR br.MIDDLE_NAME <> pw.MIDDLE_NAME OR br.LAST_NAME <> pw.LAST_NAME) 
           AND (br.TAX_ID <> pw.TAX_ID)) 
         THEN 'E' 
         WHEN NOT((br.FIRST_NAME <> pw.FIRST_NAME OR br.MIDDLE_NAME <> pw.MIDDLE_NAME OR br.LAST_NAME <> pw.LAST_NAME) 
           AND (br.TAX_ID <> pw.TAX_ID) 
           AND (br.BIRTH_DATE <> pw.BIRTH_DATE)) 
         THEN 'E' 
         END 
      END ACT 
     FROM #tmp_bridge_people_change br 
     INNER JOIN #tmp_powercampus_people pw ON br.PEOPLE_ID = pw.PEOPLE_ID 
    -- End Check Comparison People Information 

    -- Start Action after Comparison 
    -- IF FALSE RAISE MESSEAGE TO UPDATE GM STATUS 
     BEGIN TRY 
      UPDATE c 
      SET c.KEY1 = tmp.RESPOND_CODE 
      FROM #TMP_LIST_PEOPLE_ACTION tmp 
      JOIN GoldMine_test.dbo.CONTACT1 c ON tmp.PEOPLE_ID = c.KEY4 
      WHERE tmp.ACT = 'E'; 
      COMMIT TRANSACTION; 
     END TRY 
     BEGIN CATCH 
      ROLLBACK TRANSACTION; 
      UPDATE c 
      SET c.KEY1 = '99-OVR' 
      FROM #TMP_LIST_PEOPLE_ACTION tmp 
      JOIN GoldMine_test.dbo.CONTACT1 c ON tmp.PEOPLE_ID = c.KEY4 
      WHERE tmp.ACT = 'E'; 
     END CATCH 

    -- IF TRUE NEW RECORD THEN INSERT INTO PowerCampus 
     BEGIN TRY 
      INSERT INTO PC.dbo.People --People 
       (PEOPLE_CODE, 
       PEOPLE_ID, 
       PEOPLE_CODE_ID, 
       FIRST_NAME, 
       MIDDLE_NAME, 
       LAST_NAME, 
       CREATE_DATE, 
       CREATE_TIME...) 
       SELECT PEOPLE_CODE, 
        PEOPLE_ID, 
        PEOPLE_CODE_ID, 
        FIRST_NAME, 
        MIDDLE_NAME, 
        LAST_NAME, 
        CREATE_DATE, 
        CREATE_TIME, 
        'PERM'... 
       FROM Bridge_test.dbo.PEOPLECHANGES t 
       WHERE (Processed is Null) 
       AND EXISTS (SELECT 1 FROM #TMP_LIST_PEOPLE_ACTION tmp WHERE tmp.ACT = 'I' AND t.PEOPLE_ID = tmp.PEOPLE_ID AND t.USTUSTATDT = tmp.USTUSTATDT); 

      --Send PEOPLE_ID to GM - I don't know what extractly information which you want to send 
      INSERT INTO GoldMine_test.dbo.CONTACT1 (KEY4) 
      SELECT PEOPLE_ID FROM #TMP_LIST_PEOPLE_ACTION tmp 
      WHERE tmp.ACT = 'I'; 

      COMMIT TRANSACTION; 
     END TRY 
     BEGIN CATCH 
      ROLLBACK TRANSACTION; 
      INSERT INTO GoldMine_test.dbo.CONTACT1 (KEY4, U_KEY4) 
      SELECT PEOPLE_ID, '99-OVR' U_KEY4 FROM #TMP_LIST_PEOPLE_ACTION tmp 
      WHERE tmp.ACT = 'I'; 
     END CATCH 

    -- IF TRUE EXISTS RECORD THEN UPDATE PowerCampus 
     BEGIN TRY 

      UPDATE c 
       SET c.PEOPLE_CODE = pc.PEOPLE_CODE, 
         --c.PEOPLE_ID = pc., 
         c.PEOPLE_CODE_ID = pc.PEOPLE_CODE_ID, 
         c.FIRST_NAME = pc.FIRST_NAME, 
         c.MIDDLE_NAME = pc.MIDDLE_NAME, 
         c.LAST_NAME = pc.LAST_NAME, 
         c.CREATE_DATE = pc.CREATE_DATE, 
         c.CREATE_TIME = pc.CREATE_TIME... 
      FROM PC.dbo.PEOPLE c 
      INNER JOIN #TMP_LIST_PEOPLE_ACTION tmp ON c.PEOPLE_ID = tmp.PEOPLE_ID AND tmp.ACT = 'U' 
      INNER JOIN Bridge_Test.dbo.PEOPLECHANGES pc ON tmp.PEOPLE_ID = pc.PEOPLE_ID AND tmp.USTUSTATDT = pc.USTUSTATDT 
      COMMIT TRANSACTION; 
     END TRY 
     BEGIN CATCH 
      ROLLBACK TRANSACTION; 
      UPDATE c 
      SET c.U_KEY4 = '99-OVR' 
      FROM #TMP_LIST_PEOPLE_ACTION tmp 
      JOIN GoldMine_test.dbo.CONTACT1 c ON tmp.PEOPLE_ID = c.KEY4 
      WHERE tmp.ACT = 'U'; 
     END CATCH 
    -- End Action after Comparison 


    END 
    GO 
+0

方法3更好。 –

+0

用樣本數據發佈實際代碼。 –

+0

爲什麼不使用API​​?另外,GM和PCB是什麼? – bendodge

回答

0

PowerCampus有許多內置的存儲過程重複檢查,你應該考慮,然後再嘗試寫你自己的:

[dbo].[spExistDuplicatePeople] 
[dbo].[spFindDuplicatePeople] 
[dbo].[spSelDuplicatePeopleByBatch] 
[WebServices].[spSelTranscriptStudent] 

另外,你應該使用一個內置的過程在PEOPLE表中保留記錄,如[WebServices].[spInsPerson]