2015-06-18 57 views
0

我有一個項目,我正在處理需要將多個csv文件導入到數據庫的位置。我目前有2個SQL服務器(例如東海岸和西海岸),我需要能夠動態分割數據。每個文件都有一個客戶端ID號,我可以在表中查找並確定哪個服務器處理該客戶端的數據。我已經想出瞭如何將其添加到我的數據流任務。但是,我現在需要能夠將數據拆分到不同的服務器。我找到了一種方法來做到這一點,但僅限於兩臺服務器。我們正在考慮添加多個附加服務器來分割工作量。我需要能夠動態地將數據重定向到不同的服務器。SSIS導入平面文件到動態目標

例如:

CSV文件具有從一打客戶供應商數據的線。每臺服務器上的客戶都包含幾行。在我的數據流中,我正在導入平面文件,並根據客戶端ID爲每條線查找服務器。所以基本上我在這一點上的數據是這樣的:

ClientID ServerName Col1 Col2 Col3... 
------------------------------------------------------ 
12345  ServerA  data data data 
54321  ServerB  data data data 
12345  ServerA  data data data 
78901  ServerC  data data data 
54321  ServerB  data data data 
76543  ServerD  data data data 

我需要知道如何讓SSIS採取每行並將其插入到指定的表(表名/結構服務器之間的相同)的基礎上ServerName列。

我想我可能需要使用某種foreach循環,並將服務器設置爲變量,但不知道如何實現這一點。

任何建議,非常感謝。

+0

呵呵。有趣的問題。我看到的直接問題是內置文件解析發生在數據流中,因此一旦開始解析數據,嘗試更改目標的連接管理器就太遲了。您可以查看腳本組件並處理那裏的數據庫連接。這可能是你最不醜陋的做法。 – billinkc

+0

否則,我想我會將數據加載到專用服務器上的單個表中。然後我會有一個執行SQL任務將服務器的不同列表拉回,正如您所概述的那樣,使用ForEach枚舉器來清除該列表。對於找到的每個服務器,我都會使用ServerName更新目標連接管理器。然後我的數據流將從我的登臺表中選擇一個針對當前服務器名稱的篩選器。你會有效地處理文件兩次,所以對於非常大的數據集,這很多是站不住腳的,但它可以節省你的腳本 – billinkc

回答

-1

如果一切連接字符串中別的,除了服務器名相同,則操作如下:

1:創建一個執行SQL任務創建初始選擇。將結果集發送給Object類型的ResultSet變量。還要將sql任務結果集類型設置爲「完整結果集」。

2:將它推入forEach循環,並將您的5列映射到SSIS變量,因此每個列(ClientID,ServerName等)都是一個。

3:創建連接管理器到您的服務器,並打開「表達式」選項卡。選擇「連接字符串」並將其設置爲「YourHost/{user:ServerName}/DatabaseName:Port .. etc」。基本上只要在驗證連接正常後複製並粘貼連接字符串,並替換servername部分即可。

4:創建另一個sql任務,這次它只是一個插入語句,其值被參數化(?,?,?,?,?)並將變量映射到參數。

這應該做到這一點。如果您需要更多指導,請告訴我。我不得不在SSIS中做這種瘋狂的東西!

+0

不知道爲什麼這是downvoted ...我實現了它,它工作。 –