Sql-Server
導入儲存在 blob 列中的 csv 數據
這是我需要做的:
- 使用者將 CSV 文件上傳到 SQL Server 2012 blob 列
- 每天晚上,我想把每個文件都導入表中
- 我將有 2 個網站使用相同的數據庫。一個在內部,一個在 DMZ
- 如果我希望我的 2 個站點查看文件,簡單的方法是將文件儲存在數據庫中。備份所有內容也將更容易
- 如果我將文件儲存在共享文件夾中,我必須在 DMZ 中打開一個埠才能在我們的網路中看到這個共享文件夾。我不知道這是不是個好主意。此外,備份計劃將更難制定(備份數據庫和單獨備份文件並嘗試同步它們)
是否可以使用儲存過程來讀取 blob 列內的文件,在每一行上循環並將數據插入表中?
- 我應該將文件導出到臨時系統文件嗎
- 讀取文件並進行導入
或者我可以
- 直接從 blob 列中讀取文件並進行導入
其他提議?
是否可以使用儲存過程來讀取 blob 列內的文件,在每一行上循環並將數據插入表中?
確實。
但是,我會考慮重新考慮這個計劃。
SQL Server 數據庫通常不是儲存 BLOB 的好地方,特別是考慮到您稍後將轉身並將它們處理成行數據。這是您不需要使用的大量額外磁碟活動和(可能更昂貴的)儲存。此外,所提議的處理類型幾乎肯定會比許多直接處理替代方案執行得更差。一般來說,您需要做的處理越少(過程本身越簡單),您從系統中獲得的性能就越好。它可能也會更可靠。
為什麼不立即將文件轉換為行數據?您是否擔心客戶端應用程序的阻塞或延遲?如果這是唯一的問題,請考慮設置非同步排隊系統,可能使用Service Broker。您可以使用
BULK INSERT
直接從文件系統將 CSV 文件轉換為行數據,而無需先將文件載入為 BLOB。如果當您需要在同一台伺服器上執行其他東西時,這會在載入期間消耗 CPU,如果您使用的是企業版,請考慮使用資源調控器。如果由於其他限制,您必須在晚上批量處理文件,最好在白天將原始文件直接定向到網路共享上的命名 (YYYYMMDD) 文件夾中,然後每天一次使用 SSIS 包使用 Foreach 文件列舉器容器來處理文件。我想這也可以在基於作業的場景中工作,您只需每 15 分鐘左右啟動一次,以處理和刪除上一時期落在文件夾中的文件。如果您需要在原始文件和行數據之間進行某種轉換過程,SSIS 也可能是一個很好的解決方案。
根據您的具體要求,這裡有很多不同的可能性,但我認為我已經提供了足夠多的更常見的元素,您可以拼湊出最適合您情況的解決方案。