SQL Server大表數據的導出與導入命令BCP

分類:IT技術 時間:2017-05-01
SQLServer備份還原命令Sqlcmd,osql,iSql使用:http://lzh166.iteye.com/blog/1123995
SQL Server BCP使用小結:http://www.cnblogs.com/qanholas/archive/2011/07/05/2098616.html
     上面的文章已將有相關命令的使用,我們這邊文章主要解決表記錄數比較大的情況,比如300萬記錄,生成SQL腳本文件大小1.6G,用SQL Server Management Studio無法執行文件太大,用navicat跑腳本out of memery,用editPlus編輯,file too large,用UltrEdit編輯,速度慢,想用SQLDumpSplitter分割Sql文件,無效,真實愚蠢的想法。所以只能使用命令了。
1、SQLCMD
SQLCMD 允許在Windows命令窗中通過命令行提示符運行腳本.
語法如下:
C:\Users\donald>sqlcmd -?
Microsoft (R) SQL Server 命令行工具
版本 10.50.1600.1 NT x64
版權所有 (c) Microsoft Corporation。保留所有權利。

用法: Sqlcmd            [-U 登錄 ID]          [-P 密碼]
  [-S 服務器]            [-H 主機名]          [-E 可信連接]
  [-N 加密連接][-C 信任服務器證書]
  [-d 使用數據庫名稱] [-l 登錄超時值]     [-t 查詢超時值]
  [-h 標題]           [-s 列分隔符]      [-w 屏幕寬度]
  [-a 數據包大小]        [-e 回顯輸入]        [-I 允許帶引號的標識符]
  [-c 命令結束]            [-L[c] 列出服務器[清除輸出]]
  [-q "命令行查詢"]   [-Q "命令行查詢" 並退出]
  [-m 錯誤級別]        [-V 嚴重級別]     [-W 刪除尾隨空格]
  [-u unicode 輸出]    [-r[0|1] 發送到 stderr 的消息]
  [-i 輸入文件]         [-o 輸出文件]        [-z 新密碼]
  [-f <代碼頁> | i:<代碼頁>[,o:<代碼頁>]] [-Z 新建密碼並退出]
  [-k[1|2] 刪除[替換]控制字符]
  [-y 可變長度類型顯示寬度]
  [-Y 固定長度類型顯示寬度]
  [-p[1] 打印統計信息[冒號格式]]
  [-R 使用客戶端區域設置]
  [-b 出錯時中止批處理]
  [-v 變量 = "值"...]  [-A 專用管理連接]
  [-X[1] 禁用命令、啟動腳本、環境變量[並退出]]
  [-x 禁用變量替換]
  [-? 顯示語法摘要]

C:\Users\donald>

實例:
執行sql腳本(導入數據):
sqlcmd  -S  localhost -U sa -P 123456   -i "E:\user.sql"

導入顯示sql腳本文件錯誤,奶奶的不行。

2.OSQL
以下是OSQL命令的參數說明:
C:\Users\donald>osql -?
Microsoft (R) SQL Server 命令行工具
版本 10.50.1600.1 NT x64
版權所有 (c) Microsoft Corporation。保留所有權利。

註意: osql 並不支持 SQL Server 2008 R2的所有功能。
請使用 sqlcmd。有關詳細信息,請參閱 SQL Server 聯機叢書。
用法: osql                   [-U 登錄 ID]          [-P 密碼]
  [-S 服務器]                [-H 主機名]           [-E 可信連接]
  [-d 使用數據庫名稱]        [-l 登錄超時值]       [-t 查詢超時值]
  [-h 標題]                  [-s 列分隔符]         [-w 列寬]
  [-a 數據包大小]            [-e 回顯輸入]         [-I 允許帶引號的標識符]
  [-L 列出服務器]            [-c 命令結束]         [-D ODBC DSN 名稱]
  [-q "命令行查詢"]          [-Q "命令行查詢" 並退出]
  [-n 刪除編號方式]          [-m 錯誤級別]
  [-r 發送到 stderr 的消息]  [-V 嚴重級別]
  [-i 輸入文件]              [-o 輸出文件]
  [-p 打印統計信息]          [-b 出錯時中止批處理]
  [-X[1] 禁用命令,[退出的同時顯示警告]]
  [-O 使用舊 ISQL 行為禁用下列項]
      <EOF> 批處理
      自動調整控制臺寬度
      寬消息
      默認錯誤級別為 -1 和 1
  [-? 顯示語法摘要]

例子:
osql -E  -i "E:\user.sql"

這個導入時間過長,小一點的表可以導入成功,執行過程中遇到如下錯誤:
對象名 'dbo.test' 無效:http://blog.csdn.net/zhangfy1015/article/details/51690316

3.BCP不利用格式化文件的導入導出命令,用於處理大表數據

C:\Users\donald>bcp -?
usage: bcp [[database_name.]owner.]table_name[:slice_number] {in | out} datafile
        [-m maxerrors] [-f formatfile] [-e errfile]
        [-F firstrow] [-L lastrow] [-b batchsize]
        [-n] [-c] [-t field_terminator] [-r row_terminator]
        [-U username] [-P password] [-I interfaces_file] [-S server]
        [-a display_charset] [-q datafile_charset] [-z language] [-v]
        [-A packet size] [-J client character set]
        [-T text or image size] [-E] [-g id_start_value] [-N] [-X]
        [-M LabelName LabelValue] [-labeled]
        [-K keytab_file] [-R remote_server_principal]
        [-V [security_options]] [-Z security_mechanism] [-Q]

C:\Users\donald>

命令實例:
--導出
bcp test.dbo.user out  E:\user.txt -c -T   

--導入
bcp test.dbo.user  in E:\user.txt -c -T


實戰:
--導出數據
(c) 2016 Microsoft Corporation。保留所有權利。

C:\Users\donald>bcp test.dbo.user out  E:\user.txt -c -T


開始復制...

已復制 2648040 行。
網絡數據包大小(字節): 4096
總時鐘時間(毫秒)     : 25643   平均值: (每秒 105921.56 行。)
生成的txt文件只有400M左右。

--導入數據
C:\Users\donald>bcp test.dbo.user  in E:\user.txt -c -T


開始復制...
..
已向 SQL Server 發送了 1000 行。總共發送了: 2643000
已向 SQL Server 發送了 1000 行。總共發送了: 2644000
已向 SQL Server 發送了 1000 行。總共發送了: 2645000
SQLState = 22003, NativeError = 0
...
Error = [Microsoft][SQL Server Native Client 10.0]數值超出範圍
已向 SQL Server 發送了 1000 行。總共發送了: 2646000
已向 SQL Server 發送了 1000 行。總共發送了: 2647000
SQLState = 22001, NativeError = 0
Error = [Microsoft][SQL Server Native Client 10.0]字符串數據,右截斷

已復制 2648040 行。
網絡數據包大小(字節): 4096
總時鐘時間(毫秒)     : 52196   平均值: (每秒 50738.46 行。)

C:\Users\donald>
遇到如下錯誤
CTLIB message:  - L6/O8/S5/N3/5/0:
ct_connect(): directory service layer: internal directory control layer error: Requested server name not found.
Establishing connection failed.
解決方式:
http://blog.sina.com.cn/s/blog_5ceb51480101gs4j.html
---分析原因
我的系統中之前安裝了Sybase數據庫,而SQLSERVER數據庫是在Sybase之後裝的,
這樣就導致了SQLSERVER對應的環境變量在Sybase之後了,在執行BCP命令時,
系統首先找到的BCP是Sybase的BCP,而不是SQLSERVER的。用Sybase的BCP往SQLSERVER中導數據當然會有問題。
----解決方法
在PATH環境變量中將所有涉及SQL Server的環境變量提到Sybase之前,這樣就可以了。
看來windows的環境變量也有先後優先級之分,在之後的應用中得引以註意。
總結:
對於大表數據的導入與導出用BCP命令,不利用格式化文件的導入導出數據;
OSQL主要可以處理SQL腳本文件類型的數據。bcp可能會有數據丟失呀,我測試的每個表丟失了1條記錄,難道是我操作錯誤?


Tags: localhost Microsoft Windows 詳細信息 執行文件

文章來源:


ads
ads

相關文章
ads

相關文章

ad