2012-04-23 7 views

回答

51

下面是使用SSIS 2008 R2創建的示例包,它解釋瞭如何將平面文件導入到數據庫表中。

  • 創建一個名爲Fixed_Width_File.txt的固定寬度平面文件,其數據如截圖所示。屏幕截圖使用Notepad ++來顯示文件內容。它能夠顯示回車和換行符等特殊字符。 CR LF表示行分隔符回車換行

Flat file data

  • 在SQL Server數據庫中,創建一個使用下SQL腳本部分提供的腳本創建名爲dbo.FlatFile表。

  • 創建一個新的SSIS包並添加一個新的連接到SQL Server數據庫的OLE DB連接管理器。我們假設OLE DB連接管理器被命名爲SQLServer

Connection manager

  • 在包的控制流標籤,放置數據流任務

Data flow task

  • 上的數據流任務雙擊,你將採取的數據流標籤。在數據流選項卡上,放置一個平面文件源。雙擊平面文件源,將出現平面文件源編輯器。點擊新建按鈕打開平面文件連接管理器編輯器

  • 平面文件源編輯的常規部分,在連接管理器名稱(比如來源)輸入一個值,並瀏覽到平面文件的位置,然後選擇文件。本示例使用路徑C:\temp\Fixed_Width_File.txt中的示例文件如果文件中有標題行,則可以在標題行中輸入值1以跳過文本框以跳過標題行。

Flat file connection manager editor General

  • 點擊部分。根據您的選擇更改字體我選擇了Courier New,因此我可以用較少的滾動查看更多數據。在行寬文本框中輸入值69。該值是行分隔符的所有列的寬度+ 2的總和。一旦設置了正確的行寬,您應該可以在源數據列部分正確看到固定寬度的文件數據。現在,您必須點擊相應的位置才能確定列限制。請注意第4,5,6部分和下面的屏幕截圖。

Flat file connection manager editor Columns

  • 點擊高級部分。根據我們在上一步中的部分設置的列限制,您會注意到自動創建了5列。第五列是行分隔符。

Flat file connection manager editor Advanced

  • 重命名列名FirstNameLastNameIdDateRowDelimiter

Flat file connection manager editor Advanced Renamed

  • 默認情況下,該列將作爲s et與數據類型字符串[DT_STR]。如果我們相當確定,某個列將具有不同的數據類型,我們可以在高級部分對其進行配置。我們將改變Id列是數據類型four-byte signed integer [DT_I4]和日期列的是數據類型的date [DT_DATE]

Flat file connection manager editor Advanced Id column

Flat file connection manager editor Advanced Date column

  • 點擊預覽部分。數據將按照列配置顯示。

Flat file connection manager editor Preview

  • 點擊平面文件連接管理器編輯器和平面文件連接OK將被分配到數據流任務中平面文件源。

Flat file editor connection

  • 在平面文件源代碼編輯器,單擊列部分。您會注意到在平面文件連接管理器中配置的列。取消RowDelimiter,因爲我們不需要。

Flat file editor columns

  • 在數據流任務,放置一個OLE DB Destination。將平面文件源的輸出連接到OLE DB目標。

Data flow task

  • 在OLE DB目標編輯器,選擇OLE DB連接管理器命名SQLServer和設置表的名稱或視圖下拉到[dbo].[FlatFile]

OLE DB Destination connection

  • 在OLE DB目標編輯器上,單擊Mappings部分。由於在平面文件連接管理器中的列名是一樣的,在數據​​庫中的列,映射將自動發生。如果名稱不同,則必須手動映射列。點擊確定。

OLE DB Destination columns

  • 現在,包已準備就緒。執行包將固定寬度平面文件數據加載到數據庫中。

Package execution

  • 如果查詢表dbo.FlatFile在數據庫中,你會發現導入到數據庫中的平面文件數據。

Data imported into table

該樣本應該給你有關如何導入固定寬度的平面文件到數據庫的想法。它並沒有解釋如何處理錯誤日誌,但這應該讓你開始,幫助你發現其他SSIS相關的功能,當你使用包玩。

希望有所幫助。

SQL Scripts

CREATE TABLE [dbo].[FlatFile](
    [Id] [int] NOT NULL, 
    [FirstName] [varchar](25) NOT NULL, 
    [LastName] [varchar](25) NOT NULL, 
    [Date] [datetime] NOT NULL 
) 
+1

這與我目前的問題沒有關係,但我仍然贊成,只是因爲你做了這麼好的工作。 – SteveCav 2016-03-01 23:27:01

1

在派生列變換可以使用SUBSTRING()函數用於每個列的。 實施例:

列DerivedColumn

姓SUBSTRING(數據,startFrom,長度);

這裏的名字有寬度25,所以如果我們考慮到從派生列,則第0位置,你應該給予SUBSTRING(數據,0,25)指定它;

同樣,對於其他列。

1

非常好解釋,西瓦!您的教程和優秀的插圖指出了微軟應該明確

  1. ,對於一個固定長度列的寬度必須包括回車和換行(CR & LF)字符(這是我想通了,因爲預覽顯示行沒有正確排列)
  2. 即定義一個額外列以包含那些LF字符的所有重要步驟,即使它們不會被導入。我也明白了這一點。在我開始之前,我會通過找到您的答案而受益。

如果沒有這兩點,運行導入將嘗試給這個錯誤信息: 列「x列」的數據轉換返回狀態值4和狀態文本「文本被截斷或一個或多個字符在目標代碼頁中沒有匹配。「

我已在此錯誤文本中添加了希望有人會在搜索錯誤原因時找到此頁面。即使在事實發生之後,你的重要性也值得尋找!

相關問題