2013-04-24 17 views
1

我有一個事務數據庫TD與表A 我有表B. 表B另一個報告數據庫RD是一模一樣的表A中列&數據類型的條款。最佳策略從一個數據庫拷貝增量到另一個

我需要一個表複製到表B

的具體信息表A: 1)表A是事務表,並有新的交易每天都添加進去。 2)表A還對每天的現有交易進行更新,還有一個名爲updateddate的列,在交易有任何更新的情況下會更新該列。

方法,我下面: 我創建了一個SSIS包從交易數據庫中的數據複製到報告 數據庫首次在表我創建了一個新列名爲RDUpdateddate插入時間每條記錄都已更新。

我創建了另一個SSIS包,我將它設置爲每隔兩週運行一次的SqlServerJob。 它獲取在RDUpdateddate之後運行的所有交易,並將它們 複製到登臺表。然後,我使用存儲過程來插入和更新我的表B.

雖然這種方法works.I想知道如果在SSIS包本身

+0

如果我理解正確,您已經有了一個使用2個SSIS包的解決方案。但是你希望它「更有效率」;這對你意味着什麼,你想要解決什麼問題?它應該運行得更快,還是使用更少的RAM或CPU,還是更容易配置或其他?如果你可以解釋你的當前解決方案到底有什麼問題,那麼有人可能會有其他解決方案。 – Pondlife 2013-04-24 20:08:56

+0

是的,我有一個解決方案,但我需要2個SSIS包,一個臨時表和一個額外的存儲過程來完成我的任務。我想知道是否有辦法在單個SSIS任務或其他更簡單的方法中完成任務。 – CodeNinja 2013-04-24 20:57:58

+0

使用多個包,登臺表和存儲過程聽起來像是一個典型的ETL實現,所以除非你有特定的問題,否則我只會使用你所擁有的。許多ETL任務在SSIS之外更容易完成,但仍然可以使用包來控制工作流並使用「執行SQL」,「執行過程」和「腳本」任務調用其他過程。 – Pondlife 2013-04-24 21:09:08

回答

2

我常做的一切的更有效的方法此情況下,做的是這樣的: enter image description here

如果我的理解以及你在做什麼,你不能,如果一個寄存器改變識別工作無須使用領域RDUpdateddate您在表B,如果創建你想改變這一點,但我真的不認爲是好主意,你可以使用hash fie在每個表中添加查詢,只需將查詢添加到表中,但必須在每次執行包時更新。

之後是表A的左邊表的連接,如果寄存器是新的或舊的,就可以通過使用表B的一個字段來識別,如果該字段爲空,則表明它不存在。

在條件拆分中,您應該使用表B的列來知道是否知道,並且如果它已經存在,則您更喜歡更新方法。

編輯:

爲了能夠在兩個表進行比較,你可以創建一個在表A這樣的查詢:

SELECT id, field1, field2, CHECKSUM(field1, field2) HASH_TOTAL FROM Table_A 

而在表B這樣的查詢:

SELECT id, field1, field2, CHECKSUM(field1, field2) HASH_TOTAL FROM Table_B 

然後在條件拆分中,您評估值是否相等,不同或不存在表B中的值。


我希望它有幫助。

+0

嗨Rednaxel!非常感謝您的插圖。我正在看這樣的事情。如果你不介意,我對你的例子有個疑問。你的意思是代替RDUpdateddate,我可以在表B的每個表中使用一個散列字段。每次包更新表時,散列字段是否會更改?你能告訴我如何創建散列字段嗎?或者在網上提供任何有關這種方式的資源? – CodeNinja 2013-04-26 17:02:59

+0

我正在改變我的答案,添加散列比較的解釋 – Rednaxel 2013-04-26 21:23:03

相關問題