2013-10-04 49 views
1

我想批量加載到一個MS SQL表格從.txt文件中的值是相當棘手的格式。下面的例子顯示了文件的前兩部分,但是整個文件重複超過100次。標題是每個部分頂部的位置。有什麼辦法可以解決這個問題嗎?列本身是固定的長度,但我需要能夠告訴SQL從表中取值並忽略頭。任何想法呢?文件格式的從不規則的平面文件批量插入到MS SQL Server

實施例:

Example screen shot here

預先感謝。

+0

你需要在這裏展示你的編碼技巧,你想從我們那裏得到什麼樣的幫助? – Anand

+0

如果你要求流程,它應該是這樣的,1.將txt文件轉換爲streamreader,2.逐字符串分割| 3.if string [0] = choc_id然後從nextline獲取數據4.插入並完成。 – Anand

+0

謝謝阿南德。我沒有任何以前的SQL Stream經驗,所以我希望我可以通過批量插入腳本或SSIS包來處理這個問題。如果我可以將表中的數據內容存入SQL表中,則可以在存儲過程中完成剩餘的工作。我只是努力確定如何獲得它,但忽略重新出現的標題。 – user2519924

回答

0

bcp.exe或BULK INSERT命令中沒有參數或過濾器,可以讓您過濾不需要的行。所以你必須做預處理或後處理。

通過預處理,您可以使用您最熟悉的任何語言編寫工具來解析輸入文件並輸出另一個可用作批量插入的乾淨輸入的文件。

通過後處理,可以將文件原樣加載到SQL Server中(包括不需要的行),然後從表中刪除不需要的行。根據您的需求,您可能需要爲此使用中間(臨時)表格。

首先創建一個format file用於批量插入。從你的輸入看起來你可以使用固定大小的格式,這在這種情況下是很好的。您可能會遇到麻煩,在表格中的「END on」列中使用date列,並忽略任何錯誤。由於沒有其他行似乎包含有效的日期格式,因此可以將其用作粗略過濾器。所有其他的方式,你需要一個只使用(n)(var)char列的表定義。

有了這樣一個表,你可以只加載該文件,然後使用一個WHERE過濾器把數據傳輸時,進入真正的表,這樣的刪除任何無效:

INSERT INTO MyRealTable 
    SELECT CHOC_ID, EndOn, ... 
    FROM #TempBulkTable 
    WHERE CHOC_ID NOT IN ('untime', '---------------', ...) 

或者你不需經過您的批量指定FIRE_TRIGGERS插入並給表一個INSTEAD OF INSERT觸發器進行過濾 - 雖然這有點挫敗了大容量插入的目的。如果您使用臨時表,請確保在tempdb中有足夠的空間。

我希望這給你一些有用的想法。

+0

完美。這給了我很多靈感。我喜歡日期建議。我今天下午會去。 非常感謝。 – user2519924