在微軟尚發行 32位元的 Windows 10 時,可以使用 SQL Server 2008 的匯入功能,配合微軟提供的 VFP odbc driver,將VFP的資料匯入到 SQL Server。但後來微軟只發行 64位元的 Windows OS 後, VFP odbc driver 就無法使用了,必須用其他方法匯入資料。
自己寫程式一筆一筆 insert,是最直接明瞭的方法,但效率非常非常慢。最快的方式是使用微軟提供的 BCP (Bulk Copy Program),經測試,40多萬筆的資料,花費的時間在 10秒以內。
參見
- 主要想法得自 VFP 愛用者社區的討論,請問:如何將 VFP 的資料新增到 SQL Server 中之速度加快。
- 微軟的官方文件,準備資料以進行大量匯出或匯入
- 微軟關於欄位分隔符號的說明,Specify Field and Row Terminators (SQL Server)
- 說明文件,The BCP (Bulk Copy Program) command in action
下面的文章是 VFP 愛用者社區討論中引用的微軟官方文件,但原始文件已下架。可能是使用翻譯軟體轉成中文,有一些不通順的地方,稍微做一些修改。
-------------
這是微軟提供的,看樣子要研究研究一下 bcp,因為還不太了解怎麼用 bcp
http://support.microsoft.com/kb/153199/zh-tw
如何使用 SQL Server 大量複製程式, 從 Visual FoxPro 大量的資料移動到 SQL Server
文章編號 : 153199上次校閱 : 2007年2月12日
版次 : 4.1
結論
本文告訴您如何使用大量複製程式 (BCP),Microsoft SQL Server 隨附的獨立公用程式。 如果您必須同時移動大量的資料至 SQL Server, 使用 Microsoft Visual FoxPro 「 SQL 轉換精靈 」 可能會太慢。 Bulk Copy Program 公用程式只能傳送資料, 它不會建立資料表。 您可以使用 「 SQL 轉換精靈 」 來建立資料表,或您自己用 ISQL / W 建立。 為了要讓 SQL 伺服器接受 (Accept) 使用 「 快速 」 版本的 BCP 資料,您必須執行 sp_dboption 系統預存程序將 select into / bulkcopy 選項設為 True逐步說明範例
以下的範例步驟,是使用 BCP 公用程式將資料從一個 ASCII 檔案傳送至 SQL Server:1. 從 SQL Server 執行:
sp_dboption Mydatabase,bulkcopy,true
2. 從 Visual FoxPro 資料表建立使用定位點 (TAB) 分隔的 ASCII 檔案。 舉例來說,請使用低階的常式,以輸出到文字檔的欄位:
=FPUTS(fhandle, emp_id + CHR(9) + ;
last_name + CHR(9) + ;
first_name + CHR(9) + ;
title + CHR(9) + ;
PADR(DTOC(birth_date)+' '+'12:00AM',16,' ') + CHR(9) + ;
PADR(DTOC(hire_date)+' '+ '12:00AM',16,' ') + CHR(9) + ;
address + CHR(9) + ;
city + CHR(9) + ;
region + CHR(9) + ;
postalcode + CHR(9) + ;
STR(salary,12,2) )
3. 建立 bcp 格式檔案才能傳送資料。 例如, 從 SQL Server 下 bin 目錄:
bcp mydatabase.dbo.employee out c:\temp\emp.txt /Sservename /Usa /Ppassword
注意: 這個命令應該是在同一行。
4. 請遵循提示, 和型別 \t 如為每個欄位欄位終端子。
5. 出現提示時, 使用有意義的名稱, 例如 employee.fmt 儲存格式檔案。
6. 使用 MS - DOS 編輯器來編輯 .fmt 檔。
7. 在下列範例使用 employee.fmt 為變更為每個資料列第二欄為 SYBCHAR:
8. 檔案結尾 (EOF) 標記為變更第五資料行中的最後一列為 "\r\n"。
9. 將 ASCII 檔案傳輸至 SQL Server 使用 BCP 如下所示:
4. 請遵循提示, 和型別 \t 如為每個欄位欄位終端子。
5. 出現提示時, 使用有意義的名稱, 例如 employee.fmt 儲存格式檔案。
6. 使用 MS - DOS 編輯器來編輯 .fmt 檔。
7. 在下列範例使用 employee.fmt 為變更為每個資料列第二欄為 SYBCHAR:
6.0
11
1 SYBCHAR 0 6 "\t" 1 emp_id
2 SYBCHAR 0 20 "\t" 2 last_name
3 SYBCHAR 0 10 "\t" 3 first_name
4 SYBCHAR 0 30 "\t" 4 title
5 SYBCHAR 0 16 "\t" 5 birth_date
6 SYBCHAR 0 16 "\t" 6 hire_date
7 SYBCHAR 0 60 "\t" 7 address
8 SYBCHAR 0 15 "\t" 8 city
9 SYBCHAR 0 15 "\t" 9 region
10 SYBCHAR 0 10 "\t" 10 postalcode
11 SYBCHAR 0 8 "\r\n" 11 salary
8. 檔案結尾 (EOF) 標記為變更第五資料行中的最後一列為 "\r\n"。
9. 將 ASCII 檔案傳輸至 SQL Server 使用 BCP 如下所示:
bcp mydatabase.dbo.employee in c:\temp\employ.txt /f employee.fmt /S servernamec /Usa /P"pwd"
10. 回為使用步驟 1 以 FALSE 參數 FALSE, 完成時設定 Bulkcopy 選項。
另請參閱
如需詳細資訊, 請參閱 SQL Server Administrator ' s 系統 Guide。--------------------------------------------------------------------------------
這篇文章中的資訊適用於:
• Microsoft Visual FoxPro 3.0 Standard Edition
• Microsoft Visual FoxPro 3.0b Standard Edition
• Microsoft Visual FoxPro 6.0 Professional Edition
• Microsoft Visual FoxPro 7.0 Professional Edition
• Microsoft Visual FoxPro 8.0 Professional Edition
• Microsoft Visual FoxPro 9.0 Professional Edition
關鍵字: kb3rdparty kbhowto kbinterop KB153199 KbMtzh kbmt
--------------------------------------------------------------------------------
需下載並安裝 sqlcmd,才能執行 bcp
--------
C:\temp>bcp [rtcourse-tst].[caucgi].[dept2] out "c:\temp\tst.txt" -c -t -S localhost -U agee
密碼:
開始複製...
已複製 357 個資料列。
網路封包大小 (位元組): 4096
時間 (毫秒) 總計 : 1 平均 : (每秒 357000.00 資料列)
C:\temp>bcp [rtcourse-tst].[caucgi].[dept2] format nul -c -f "c:\temp\tst.fmt" -c -t -S localhost -U agee
警告: -c 覆寫 -c。
密碼:
--------------
C:\temp>bcp [rtcourse-tst].[caucgi].[dept2] out "c:\temp\tst.txt" -c -t -S localhost -U agee
密碼:
開始複製...
已複製 357 個資料列。
網路封包大小 (位元組): 4096
時間 (毫秒) 總計 : 1 平均 : (每秒 357000.00 資料列)
C:\temp>bcp [rtcourse-tst].[caucgi].[dept2] format nul -c -f "c:\temp\tst.fmt" -c -t -S localhost -U agee
警告: -c 覆寫 -c。
密碼:
--------------
沒有留言:
張貼留言