2014-05-12 90 views
0

我需要每天將大量的數據插入到我的SQL Server數據庫中。數據是從文件中插入的,其中行代表今年的數據,其中一些行可能會更改,而新行每天都會添加到文件中,所以我需要檢查文件中是否有一行被更改並且更新數據庫並始終插入新行。因此,你推薦什麼方法(清除數據庫/批量插入,逐行讀取和在C#中插入,ssis等)?從csv每天插入數據到SQL Server中

+0

您是否熟悉如何創建「Delta」寫入/從.CSV文件插入數據庫不是很困難。有很多不同的方法來做到這一點..我會親自創建一個具有文件結構的類以及你想要插入到數據庫中的字段。然後創建一個存儲過程,它將執行插入或更新。也顯示你到目前爲止所嘗試的.. – MethodMan

+0

有多少數據是「大」?新的比例是多少?你有硬件性能限制嗎?這可以在一夜之間完成嗎?一旦數據在那裏,它主要是一個報告資源?在建議有意義之前,有很多因素需要解決。 –

+0

我正處於規劃階段,所以現在我們有我們的ASP.NET應用程序,並且正在創建文件CVS。該文件大約在年底時有1000,000行,當它已滿時。它每天幾乎有99%的新行,其中一些行可以更改。不,我沒有硬件性能限制,可以在一夜之間完成。導入的數據僅用作報告資源。簡單地說,我們目前使用兩種技術進行數據導入/導出,控制檯應用程序調用Web服務來執行導出和SSIS導入,但由於數據庫和數據工具版本的原因,我對SSIS不滿意。 – Milan

回答

1

根據您的意見,我會放棄表格並使用SSIS每晚重新加載CSV,然後創建新的索引作爲夜間工作的一部分。
如果每個CSV都包含所有相關信息,那麼這是最簡單的方法。 沒有理由更新/合併邏輯,我可以看到。

另外,考慮到你對SSIS的厭惡,帶有索引創建的直接表格加載應該很容易在C#腳本中實現。

SSIS路線:

首先,建立第一負載所證明here

接下來,在表上右鍵單擊SSMS併爲該表生成創建腳本。

然後,在加載任務之前運行的SSIS中創建一個執行SQL任務。該SQL任務將運行以下兩段代碼drop table <your table name>,後面是您之前複製的創建表腳本。

最後(可選)創建執行SQL任務,該任務在數據裝入任務之後運行,該任務將創建任何所需的索引。由於我對您的數據一無所知,因此我建議您使用非聚集索引,其中包含報告中用於參數的所有列,例如CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD);

雖然不是一個完美調整的解決方案,但它應該足以滿足您的需求正在努力做,並易於維護。

我可能可以在稍後添加屏幕截圖。

+0

當你說:「帶有索引創建的直接表加載」時,你的意思是在某種「批量插入表」中? – Milan

+0

沒錯。批量插入到每晚重新創建的表中,然後在任何用作報表參數的列上創建索引。 –

+0

O.K.你有什麼樣的例子可以指導我嗎? – Milan

0

有不同的方法取決於數據是如何被使用的應用程序的那一刻,我建議以下步驟: 創建日程表的作業上傳數據到臨時表(S)

  1. 批量插入溫度表
  2. 插入新行形成臨時表主表
  3. 更新現有的臨時行主表

也可以刪除前通過將臨時表與主表進行比較來確定行,然後構建將臨時表中的所有內容插入到主表中。

0

聽起來像你需要一個「upsert」。 SQL服務器支持the MERGE statement實現此目的。您可以將您的CSV數據提供給臨時表&,然後將其合併到您的目標表中,並使用該語法。可能SSIS會讓你把這件事放在一個整潔的工作中。