Export data to CSV – (1) Database
本文以 bcp 產生 csv 檔案工作流程的實作說明,當使用者要求匯出一份資料時,先將查詢語法組合為字串並建立新工作,透過 SQL Server Agent 排程執行輸出檔案。
bcp 基本語法
bcp 指令是 SQL Server 可以做大量資料匯入與匯出,在 DOS Command 環境下中執行,先用幾個範例認識 bcp 指令的用法。
(本文的範例是 Northwind 資料庫)
資料來源指定一個資料表或檢視
bcp dbo.Region out "E:\Region.csv" -S "(local)" -d Northwind -U sa -P mis123 –c
資料來源是一個 T-SQL 查詢語法
bcp "select * from dbo.Region" queryout "E:\Region2.csv" -t "," -S "(local)" -d Northwind -U sa -P mis123 -c
資料來源是執行一個預存程序
bcp "EXEC [dbo].[CustOrderHist] 'ALFKI'" queryout "E:\CustOrderHist.csv" -t "," -S "(local)" -d Northwind -U sa -P mis123 -c
加強 csv 在 Excel 的可讀性
產生欄位標題
以 bcp 產生的 csv 檔案是不包括欄位標題,找到解決方式是先產生一個欄位標題文字檔,再與 匯出的 csv 檔案合併為另一個檔案。
COPY 指令範例
COPY /V /Y /B E:\Temp\Header.txt + E:\Temp\DATA.temp E:\Temp\DATA.csv DEL E:\Temp\DATA.temp
Header.txt 是欄位標題
DATA.temp 是 bcp 產生的 csv 格式的檔案
DATA.csv 是合併的新檔案名稱
當資料來源是預存程序時,SQL Server 2012 以後的版本可用 T-SQL 語法查詢得到欄位的標題
SELECT name FROM sys.dm_exec_describe_first_result_set_for_object ( OBJECT_ID('dbo.CustOrdersOrders'), NULL );
資料內容可讀性
當使用者以 Excel 開啟 csv 檔案,遇到以下幾個情況無法閱讀
(1) 資料型別為日期或時間
如以下 csv 第 2 ~ 4 欄為日期格式
10643,1997-08-25 00:00:00.000,1997-09-22 00:00:00.000,1997-09-02 00:00:00.000
10692,1997-10-03 00:00:00.000,1997-10-31 00:00:00.000,1997-10-13 00:00:00.000
10702,1997-10-13 00:00:00.000,1997-11-24 00:00:00.000,1997-10-21 00:00:00.000
10835,1998-01-15 00:00:00.000,1998-02-12 00:00:00.000,1998-01-21 00:00:00.000
10952,1998-03-16 00:00:00.000,1998-04-27 00:00:00.000,1998-03-24 00:00:00.000
11011,1998-04-09 00:00:00.000,1998-05-07 00:00:00.000,1998-04-13 00:00:00.000
在 Excel 中呈現如下圖
(2) 文件前字元為零,如 00001234 會呈現 1234
若使用者主要以 Excel 開啟閱讀,解決方式則輸出資料時,改為公式
="00001234"
工作流程實作
範例實作在 Northwind 資料庫中,建立一個工作流程資料表,與相關流程作業的預存程序。
下載: Northwind with Export CSV procedure
運作方式
(1) 使用者介面呼叫預存程序 CustOrdersOrders_ExportTask 建立一個新工作
(2) SQL Server Agent 排程執行 SysPrint_BigQuery_DoTask 讀取資料並匯出 csv 檔案