用代碼從文件中導入數據到SQL Server


引言

導入數據到SQL Server 是常見的需求,特別是定期導入這種需求。

對於定期導入主要有以下幾種方式可選擇:

  1. Bulk Insert
  2. Bcp Utility
  3. OpenRowSet
  4. 寫程序導入(使用poi, npoi, ExcelDataReader 等各種組件導入導出,后面不做描述)

接下來我們詳細分析下他們的特點和要求

Bulk Insert

執行環境:SQL Server,屬於Transact SQL, 可在查詢窗口和存儲過程中運行。

支持版本:從SQL Server2008開始支持

語法詳見:MSDN Bulk Insert

功能特點:支持txt, csv等有分隔符分割數據的文件,因CSV不支持多個sheet, 所以Bulk Insert只支持導入單個文件。

使用舉例:

在SP中使用,數據文件和分隔符是可變的,所以使用下面的方式:

強調幾個比較重要的配置:

  • FilePath:對於@p_filePath,如果是遠程磁盤,需使用UNC(Universal Naming Convention )格式, \\Systemname或主機IP\ShareName\Path\FileName
  • DataFileType:數據編碼{ 'char' | 'native' | 'widechar' | 'widenative' },widechar和widenative支持unicode

在Windows 批處理文件中用 osql 調用使用Bulk Insert 的SP,當然你也可以直接在在Sql Server Job 中調用。

 Bcp Utility 

執行環境:window 命令窗口或在batch文件中執行,有batch文件就可以用window計划或Control-M等工具調用。

語法詳見:BCP Utility

功能特點:可以在數據文件與SQL Server之間導入、導出數據,也可以導出格式文件。

bcp [database_name.] schema.{table_name | view_name | "query" {in data_file | out data_file | queryout data_file | format nul}
  • in 導入數據到table
  • out 導出table 數據到文件
  • queryout 導出查詢結果到文件
  • format nul 導出格式文件

使用舉例:

使用時可能碰到各種報錯,例如數據庫連接不成功、文件路徑不正確、表訪問修改權限不夠、格式文件不對或數據文件有問題等等

我在使用時采用以下思路:

  • 先用format nul 根據表導出格式文件
  • 使用out 導出數據文件
  • 在導出的數據文件基礎上修改,制作新的數據文件
  • 使用in 和導出的格式文件導入數據

下面的命令使用“,”進行分割,可以使用csv文件,詳細命令如下:

  • -S:server name
  • -T:SQL Server 信任模式,若不指定,則需用-U、-P指定數據庫用戶名,密碼
  • -t :字段分隔符,默認是tab字符,-t,表示用逗號分隔
  • -c:表數據是字符型,以tab字符為字段分隔符,以\r\n為行分隔符
bcp instance.dbo.table format nul -S servername -f FormatFile.fmt -T -t, -c

bcp instance.dbo.table out c:\dataFile.csv -S servername -T -t, -c

bcp instance.dbo.table in dataFilePath -f formatFilePath -S serverName -T

 對於格式文件,說明如下,圖片來至MSDN

 

OpenRowSet

 

執行環境:SQL Server,屬於Transact SQL, 可在查詢窗口和存儲過程中運行。

支持版本:從SQL Server2008開始支持

語法詳見:MSDN Bulk Insert

功能特點:支持txt, csv等有分隔符分割數據的文件、excel、代替dblink從其他數據庫(oracle 等)查詢數據。

Provider String:

  • Jet引擎 :Microsoft.Jet.OLEDB.4.0   
    • Jet 是 Joint Engine Technology
    • "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=MyUserID;Password=MyPassword;"
  • ODBC:MSDASQL
    • "Provider=MSDASQL;DSN=dsnName;UID=MyUserID;PWD=MyPassword;"
  • Oracel:MSDAORA
    • "Provider=MSDAORA;Data Source=serverName;User ID=MyUserID; Password=MyPassword;"

更多請見MSDN參考

使用舉例:

下圖面是從excel 2007中讀取數據的例子,從指定的work sheet 中讀取數據:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM