2014-09-23 83 views
0

我有3個表 -負載表C

 --server 1 
     CREATE TABLE TableA (GROUP_ID INT 
          ,STATUS VARCHAR(10)) 
     --server 2 
     CREATE TABLE TableB (GROUP_ID INT 
          ,NAME VARCHAR(10) 
          ,STATE VARCHAR(50) 
          ,COMPANY VARCHAR(50)) 
     -- server 1 
     CREATE TABLE TableC (GROUP_ID INT 
          ,NAME VARCHAR(10) 
          ,STATE VARCHAR(50) 
          ,COMPANY VARCHAR(50)) 

樣本數據

 INSERT INTO TableA (1, 'READY'),(2,'NOT READY),(3,'READY'),(4,'NOT READY') 
     INSERT INTO TableB (1, Mike, 'NY', 'aaa'), (1, Rick, 'OK','bbb'), (2, Smith, 'TX','ccc'), (3, Nancy, 'MN','bbb'), (4, Roger, 'CA','aaa') 

我試圖建立一個SSDT(SSIS 2012)包從表B的TableC中加載數據,僅用於TableA中STATUS ='READY'的GROUP_ID,並且更改STATUS ='LOADED'我需要通過使用TableA-GROUP_ID和S的項目級別參數或變量來完成此操作TATUS,因爲我會爲大約60張桌子做這個,這些值可能會改變。

我必須建立一個SSIS包,這是一個要求。使用鏈接服務器的 不是首選。除非通過SSIS無法實現。

任何幫助,將不勝感激。

回答

1

由於這兩個表位於不同的服務器上,因此可以使用兩個源創建數據流。您需要將連接管理器設置爲兩個數據庫,然後將一個Source指向保存TableA的數據庫,另一個指向保存TableB的數據庫。完成此操作後,可以使用合併聯接將兩者聯接,然後使用條件拆分丟棄沒有所需值或值的記錄。它最終會看起來有點像這樣:

Example data flow

首先,您需要設置的來源已經討論過。但是,由於您想要使用合併連接,因此您需要對來源的輸出進行排序。您可以在SSIS與排序變換做到這一點,但你最好還是先建立一個ORDER BY子句到你的SELECT語句,你必須在來源,然後告訴SSIS的輸出進行排序:

  • 右鍵單擊每個源,然後選擇顯示高級編輯器。
  • 轉到輸入和輸出屬性選項卡。
  • 選擇OLE DB源輸出,然後將右側的IsSorted設置爲True。
  • 展開「OLE DB源輸出」,然後展開「輸出列」。
  • 點擊你的(大概GROUP_ID)排序列,並設置SourceKeyPosition爲1

下面是最後一位的情況下的圖像你在所有丟失的 - 它可以是一個小繁瑣讓周圍的屬性在SSIS如果你不使用它:

SortKeyPosition picture

既然你想改變可能加載狀態值,你可以在項目中的參數設置此。只需從解決方案資源管理器轉到該頁面,然後單擊以添加新參數。您應該結束了,像這樣:

enter image description here

當你使用到2012年,你就可以在SSMS釋放後配置此值,避免了需要重新工作,這或創建配置文件。

設置條件拆分時,您有幾個選項。如果將來可能想將其他STATUS值的行發送到其他表中,那麼您應該查找STATUS值爲READY的情況,但是如果您只關心READY行,您也可以按照我的方式在這裏:

Conditional Split setup

當您將條件性拆分到目的地的輸出,它會問你要使用的輸出。如果您的設置與我使用的方式相同,請使用條件分割默認輸出,並且它將通過所有不符合您所述條件的行。

如果您在加載數據時需要更新數據的值,這取決於您希望顯示更新的位置。如果您想單獨保留TableA和TableB,但更改TableC中的值,則可以在條件拆分之後和目標之前設置派生列轉換。然後,您可以用一個替換值的狀態欄設置(這可以參數化,如上):

Derived Column with replace

如果要更新TableA中的狀態字段,那麼你應該回去控制流,並且在您正在處理的數據流之後,添加一個執行SQL任務,該任務連接到保存TableA的數據庫,並運行一個簡單的SQL更新語句。

如果這將在營業時間之外運行,並且您知道在此期間不會有任何新行,您可以簡單地更新當前具有READY狀態的所有行。如果您需要更精確地更新行,因爲在您工作時情況可能會繼續發生變化,那麼您可能需要重新考慮這一點 - 一種選擇是在開始時獲取想要更新的所有GROUP_ID值,將其存儲在變量中,並將該變量用作Source選擇語句和Execute SQL Task更新語句中的參數。你也可以選擇循環工作,但是這顯然比批量操作慢很多。


這部分是我原來的答覆的問題進行了更新過,但我會離開這裏的情況下,它給其他人有用:

如果表(A和B)都在同一個數據庫,而不是條件性拆分的,你可以設置源後成爲它連接表A至表B中的select語句,並且有一個WHERE子句僅就緒的狀態選擇行:

select GROUP_ID, NAME, STATE, COMPANY 
    from TableA a 
inner join TableB b 
    on a.GROUP_ID = b.GROUP_ID 
where a.STATUS = 'READY'; 
+0

謝謝爲了您的迴應。 TableA和TableB在不同的服務器上,所以無法加入!或者我可以嗎?我不知道它是否可能在SSIS中。如果表A是我的源表並且TableC是我的目標,則使用條件拆分方法。我將在哪裏定義我的TableB?我編輯了原文。請參閱其他要求/限制。再次感謝。 – sql84 2014-09-24 14:21:40

+0

您可以將A和B設置爲來源,指向不同的服務器。然後,您可以使用GROUP_ID上的合併連接在SSIS中加入數據,然後添加條件拆分。 現在我更清楚地理解了這些限制,我將編輯我的回覆以適應。 – 2014-09-24 19:13:05

+0

@ sql84 - 我已根據您修改的問題編輯了我的答案! – 2014-09-24 20:11:39