我是一名軟件人員,但在PowerShell知識的第二週。PowerShell - 將大固定寬度文件與大型SQL表進行比較
我們有一組12個固定寬度的格式文件,其中包含人員列表(記錄可能被複制)。這些文件大約800MB,總行數約爲1400萬。看第一個文件,它包含1,201,940行。
此外,我們有一個SQL表,應該包含所有的數據(不同的記錄)。我的任務是使用PowerShell通過將源文件中的幾個選擇字段與SQL表進行比較,然後將任何缺失的記錄寫入CSV日誌來確保數據完全加載。
我們假設我感興趣的字段是ID,FirstName,LastName,並且對於所有情況,我限制我的對象/查詢只考慮這些字段。
在PowerShell中比較數據最理想的方法是什麼?您是否將數據綁定到SQL,使其完成工作,然後檢索結果,或將所有數據捆綁到PowerShell並在其中進行工作?
我想過以下的思路,但沒有測試過:
- 創建一個SQL表變量(
@fileInfo
)。從文件($dtFile
)創建一個DataTable
。使用$dtFile
,對於每X行,加載@fileInfo
。在@fileInfo
和SQL表之間執行LEFT JOIN
,並將結果推送到DataTable($dtResults
)中。將$dtResults
寫入日誌。清空@fileInfo
的內容以準備循環的下一次迭代。這似乎是我最好的想法。 - 從文件(
$dtFile
)創建一個DataTable
。使用$dtFile
,對於每X行,構造一個SQL查詢語句,該語句有一個可怕的WHERE
子句,該子句限制數據庫返回的行。在另一個DataTable中移動($dtSQL
)。比較兩者並記錄$dtFile
中未出現在$dtSQL
中的任何條目。看起來很嚴重,但有效。 - 將文件中的所有1.2m記錄載入
DataTable
。將它們批量插入SQL臨時表,LEFT JOIN
針對SQL表,檢索結果並將結果寫入日誌。我假設我會因爲在網絡上推送一堆數據而陷入困境 - 將SQL表中的所有記錄加載到
DataTable
,將文件中的所有記錄加載到第二個DataTable
中,比較PowerShell中的結果並將結果寫入日誌。我想我會用完內存......?
我會爲每個解決方案創建腳本並自己做一個測試,但是我處於時間緊縮之中,沒有奢華。情況並不總是這樣嗎?
編輯:我張貼工作對我來說低於
您是否可以訪問同一服務器或其他可訪問的服務器上的其他數據庫? 1.2M行並不是那麼大。您可能只需執行整個csv文件的標準bcp批量插入。在一臺體面的服務器上最多3小時。請按照批量插入指南https://technet.microsoft.com/en-us/library/ms177445%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396即表鎖!和索引管理!和日誌管理!!!!!。 – Gareth
http://stackoverflow.com/questions/2479434/run-a-shell-command-with-arguments-from-powershell-script – Gareth
你能顯示一個固定寬度輸入文件的樣本/片段嗎? –