2009-05-18 57 views
6

我想基於一個公用密鑰更新另一個表中的數據表中的字段。如果它是在直接的SQL,這將是這樣的:使用SSIS更新表

Update EHSIT 
set e.IDMSObjID = s.IDMSObjID 
from EHSIT e, EHSIDMS s 
where e.SITENUM = s.SITE_CODE 

但是,兩個表不在同一個數據庫,所以我嘗試使用SSIS做了更新。哦,sitenum/site_code是varchar,另一個是nvarchar,所以我必須進行數據轉換才能匹配。

我該怎麼做?
我有一個數據流對象,其源代碼爲EHSIDMS,目標爲EHSIT。我有一個數據轉換來將unicode轉換爲非unicode。但是,我如何根據比賽進行更新?我已經嘗試了使用SQL Command作爲數據訪問模式的目標,但它似乎沒有源表。如果我只是映射要更新的字段,它如何基於字段匹配來限制它?

我即將把我的源表導出到Excel或其他東西,然後嘗試從那裏輸入,雖然看起來所有這些都會讓我去除數據轉換步驟。

不應該有更新數據任務或什麼?它是那些數據流轉換任務之一,我只是不知道它是哪一個?

回答

8

您可以使用SQLCommand(帶參數),但您將有效地爲每行寫入UPDATE。我發現最好在目標端編寫一個臨時表(來自遠程端的所有數據或由SSIS確定的要更改的數據),並使用單個SQL執行更新。

+1

好吧,那有效。我在目標數據庫中創建了一個臨時表,將數據複製到它,然後使用update語句來填充我的一個字段。刪除臨時表,我完成了。謝謝。 – thursdaysgeek 2009-05-18 21:52:28

+1

請始終嘗試使用臨時表,嘗試在數據塊中進行思考。如果您有100萬條需要更新的記錄,則使用更新語句更新每條記錄的速度非常緩慢。因此,您應該使用1個單個表和語句來更新。 – JSC 2009-05-29 07:38:53

2

您可以隨時使用完整的數據庫名稱。

UPDATE server1.databasename.EHSIT 
SET E.IDMSOBJID = S.IDMSOBJID 
FROM server1.databasename.EHSIT E, server2.databasename.EHSIDMS S 
WHERE E.SITENUM = S.SITE_CODE 



[serverpath].[database].[databaseobject] 
0

我發現使用緩慢變化的維度,將商業關鍵字作爲匹配的值,並將其他屬性更改爲更改值似乎可行。

Devtron,我已經試過了,並得到有關服務器路徑的錯誤,裏面有很多/。我還被告知,這是高度被忽視的,特別是如果這是一個經常發生的操作。