Sql-Server

導入儲存在 blob 列中的 csv 數據

  • April 18, 2013

這是我需要做的:

  1. 使用者將 CSV 文件上傳到 SQL Server 2012 blob 列
  2. 每天晚上,我想把每個文件都導入表中
  3. 我將有 2 個網站使用相同的數據庫。一個在內部,一個在 DMZ
  4. 如果我希望我的 2 個站點查看文件,簡單的方法是將文件儲存在數據庫中。備份所有內容也將更容易
  5. 如果我將文件儲存在共享文件夾中,我必須在 DMZ 中打開一個埠才能在我們的網路中看到這個共享文件夾。我不知道這是不是個好主意。此外,備份計劃將更難制定(備份數據庫和單獨備份文件並嘗試同步它們)

是否可以使用儲存過程來讀取 blob 列內的文件,在每一行上循環並將數據插入表中?

  1. 我應該將文件導出到臨時系統文件嗎
  2. 讀取文件並進行導入

或者我可以

  1. 直接從 blob 列中讀取文件並進行導入

其他提議?

是否可以使用儲存過程來讀取 blob 列內的文件,在每一行上循環並將數據插入表中?

確實。

但是,我會考慮重新考慮這個計劃。

SQL Server 數據庫通常不是儲存 BLOB 的好地方,特別是考慮到您稍後將轉身並將它們處理成行數據。這是您不需要使用的大量額外磁碟活動和(可能更昂貴的)儲存。此外,所提議的處理類型幾乎肯定會比許多直接處理替代方案執行得更差。一般來說,您需要做的處理越少(過程本身越簡單),您從系統中獲得的性能就越好。它可能也會更可靠。

為什麼不立即將文件轉換為行數據?您是否擔心客戶端應用程序的阻塞或延遲?如果這是唯一的問題,請考慮設置非同步排隊系統,可能使用Service Broker。您可以使用BULK INSERT直接從文件系統將 CSV 文件轉換為行數據,而無需先將文件載入為 BLOB。如果當您需要在同一台伺服器上執行其他東西時,這會在載入期間消耗 CPU,如果您使用的是企業版,請考慮使用資源調控器。

如果由於其他限制,您必須在晚上批量處理文件,最好在白天將原始文件直接定向到網路共享上的命名 (YYYYMMDD) 文件夾中,然後每天一次使用 SSIS 包使用 Foreach 文件列舉器容器來處理文件。我想這也可以在基於作業的場景中工作,您只需每 15 分鐘左右啟動一次,以處理和刪除上一時期落在文件夾中的文件。如果您需要在原始文件和行數據之間進行某種轉換過程,SSIS 也可能是一個很好的解決方案。

根據您的具體要求,這裡有很多不同的可能性,但我認為我已經提供了足夠多的更常見的元素,您可以拼湊出最適合您情況的解決方案。

引用自:https://dba.stackexchange.com/questions/40055