2023年9月18日 星期一

使用 SQL Server 的 BCP, 將 Visual FoxPro 的大量資料匯入到 SQL Server

在微軟尚發行 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 愛用者社區討論中引用的微軟官方文件,但原始文件已下架。可能是使用翻譯軟體轉成中文,有一些不通順的地方,稍微做一些修改。

-------------

這是微軟提供的,看樣子要研究研究一下 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:
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。
密碼:
--------------


沒有留言:

張貼留言

網誌存檔