-4

請幫助我,我需要對我的維度進行增量處理,以便通過T-SQL存儲歷史數據。我嘗試使用MERGE語句,但它不起作用,因爲此過程會刪除目標中但不在源表中存在的數據。有記錄歷史的T-SQL的增量負載

有人有建議嗎?

對於爲例我源表:源表是我的階段,
鱈DESCRIPT國家
AAA DESC1 MI
BBB說明2 TX
CCC說明3 MA
在第一負載我的尺寸將等於STAGE

但是我可以在源表改變值爲例

AAA CHANGEDESCRIPTION禰

所以,我需要更新我的尺寸是這樣的:
科德DESCRIPT國家
AAA DESC1宓前
AAA CHANGEDESCRIPTION MI實際
BBB說明2 TX實際
CCC說明3 MA實際
這是我的DW我需要的信息的實際和所有的歷史

+0

請出示一些示例數據和預期的結果 – TheGameiswar

+0

我更新,例如 – twister8

回答

0

試試這個。列Aging始終爲「0」爲當前記錄,並表示改變一代:

SELECT * INTO tbl_Target FROM (VALUES 
('AAA','Desc1','MI',0),('BBB','Desc 2','TX',0),('CCC','Desc 3','MA',0)) as X(Cod, Descript, State, Aging); 
GO 
SELECT * INTO tbl_Staging FROM (VALUES ('AAA','Desc4','MI')) as X(Cod, Descript, State); 
GO 
UPDATE t SET Aging += 1 
FROM tbl_Target as t 
INNER JOIN tbl_Staging as s on t.Cod = s.Cod; 
GO 
INSERT INTO tbl_Target(Cod, Descript, State, Aging) 
SELECT Cod, Descript, State, 0 
FROM tbl_Staging; 
GO 
SELECT * FROM tbl_Target; 

請注意,如果你在臨時表中的記錄,這是「不變」,你會得到虛假的變化。如果是這樣,你必須在兩個查詢中將它們過濾掉。

+0

韓國社交協會爲anwser 我試圖忽視的問題刪除句子在這樣的合併...... WHEN NOT MATCHED BY SOURCE 然後刪除 我評論的clausule WHEN NOT MATCHED BY SOURCE,現在它的OK 你覺得這個怎麼樣的解決方案?這很好? – twister8

+0

請將您的代碼作爲答案發布。您必須在100%的時間內執行「插入」操作,但在匹配的情況下,您還必須執行「UPDATE」。我沒有看到你如何使用MERGE來解決這個問題。 –

0

我只是發表意見的條款刪除...告訴我你怎麼想請

 MERGE DimTarget AS [Target] --— begin merge statements (merge statements end with a semi-colon) 
     USING TableSource AS [Source] 
     ON [Target].ID = [Source].ID AND [Target].[IsCurrentRow] = 1 
     WHEN MATCHED AND --— record exists but values are different 
     (
       [Target].Dscript <> [Source].Descript 
      ) 
     THEN UPDATE SET --— update records (Type 1 means record values are overwritten) 
       [Target].[IsCurrentRow] = 0 
      -- , [Target].[ValidTo] = GETDATE() 
     WHEN NOT MATCHED BY TARGET --— record does not exist 
     THEN INSERT --— insert record 
     (
      Descritp 
     , [IsCurrentRow] 
     ) 
     VALUES 
     (
     Descript 
     , 1 
     ) 
     --WHEN NOT MATCHED BY SOURCE --— record exists in target but not source 
     --THEN DELETE -- delete from target 
     OUTPUT $action AS Action, [Source].* --— output results