sqlserver 邏輯備份命令 bcp

1.bcp命令參數解析

bcp命令有許多參數,下面給出bcp命令參數的簡要解析

複製代碼

用法: bcp {dbtable | query} {in | out | queryout | format} 數據文件
  [-m 最大錯誤數]             [-f 格式化文件]         [-e 錯誤文件]
  [-F 首行]                   [-L 末行]             [-b 批大小]
  [-n 本機類型]               [-c 字符類型]         [-w 寬字符類型]
  [-N 將非文本保持爲本機類型] [-V 文件格式版本]     [-q 帶引號的標識符]
  [-C 代碼頁說明符]           [-t 字段終止符]       [-r 行終止符]
  [-i 輸入文件]               [-o 輸出文件]         [-a 數據包大小]
  [-S 服務器名稱]             [-U 用戶名]           [-P 密碼]
  [-T 可信連接]               [-v 版本]             [-R 允許使用區域設置]
  [-k 保留空值]               [-E 保留標識值]
  [-h"加載提示"]              [-x 生成xml 格式化文件]

複製代碼

其中最常用的已經用粉紅色字體標註。

2.bcp命令實例

這裏我們以AdventureWorks樣例數據庫爲例進行實驗。

2.1.將表中數據導出到一個文件中(使用可信連接)

bcp AdventureWorks.Sales.Currency out c:\Currency.dat -T -c

上面的參數 out 表示輸出文件,c:\Currency.dat是文件名和路徑,-T表示可信連接,這個跟sqlcmd有點不同,在sqlcmd中使用-E表示可信連接。-c表示以字符形式輸出,如果使用-w的話,輸出內容相同,但是輸出文件的大小將增加一倍。如果你要將導出的Currency.dat文件導入到非sql server數據庫中,那麼使用-w比較好。

2.2.將表中數據導出到一個文件中(使用混合模式身份驗證)

bcp AdventureWorks.Sales.Currency out c:\Currency.dat -c -Usa -Psa12345 -S.

這個數據導出語句與前面的不同之處是,前面使用可信連接,也就是windows驗證,不需要輸入用戶名和密碼。而此時使用的是sql server 驗證方式,所以得輸入sql server數據庫用戶名與密碼。這裏-S表示要連接的數據源,我這裏-S.表示連接本地的默認實例,如果不加-S這個參數也會連接到默認實例中,如果要連接命名實例的話,可以使用參數:-S<server_name\instance_name>

2.3.將文件中的數據導入到表中

bcp Utility中提到:

“如果使用 bcp 備份數據,請創建一個格式化文件來記錄數據格式。 bcp 數據文件不包括任何架構或格式信息,因此如果已刪除表或視圖並且不具備格式化文件,則可能無法導入數據。”

這句話的意思是,假如你要使用bcp來備份數據的話,那麼最好也將數據的表結構也跟數據一起導出來。這樣的話即使表被刪除了,也可以通過先創建表,然後再使用bcp導入數據的方法進行還原。但是如果你只是用bcp備份數據,而沒有備份表結構,那麼當表被刪除以後,你將無法使用bcp導入數據。

更深層的意思就是,如果你要使用bcp導入數據,那麼必須有表結構。這個類似於insert into select的複製操作,因爲它也需要先創建好表,然後再進行數據備份。具體可以參考:SELECT INTO 和 INSERT INTO SELECT 兩種表複製語句

所以假如我們要將前面導出的Currency.dat導入到數據庫中,那麼數據庫中必須有對應的一張表,我們這裏創建一張叫做Sales.Currency2的空表,sql語句如下: 

USE AdventureWorks;
GO
SELECT * INTO Sales.Currency2 
FROM AdventureWorks.Sales.Currency WHERE 1=2;--只創建表結構而不會插入數據

在創建好表結構以後,就可以將本地文件中的數據導入到數據庫表中,導入的bcp命令如下:

bcp AdventureWorks.Sales.Currency2 in c:\Currency.dat -T -c

2.4.bcp中使用queryout關鍵詞

如果要根據某種條件來導出數據的話,可以使用queryout關鍵字。

2.4.1.將特定的列複製到數據文件中

bcp "SELECT Name FROM AdventureWorks.Sales.Currency" queryout c:\Currency.Name.dat -T -c

2.4.2.將特定的行復制到數據文件中

bcp "select * from AdventureWorks.Sales.Currency where CurrencyCode='AED' and Name='Emirati Dirham'" queryout c:\Currency3.dat -T -c

3.大數據量的批量導入

bcp本身就可應用於大數據量的批量導入,不過他是命令行形式,如果要使用sql命令進行大數據量的批量導入,可以使用bulk insert,這個在之前的一篇博客中有提到,並進行了實驗,可以參考:某社區600萬用戶數據導入MYSQL、MSSQL、Oracle數據庫方法。另外還找了一篇博客,裏面列出了bulk insert和bcp的批量導入方式,詳細請參考:SQL Server BCP使用小結

bcp並不只是只能在cmd命令行中執行,也可以在sql查詢語句中執行,不過這需要調用一個存儲過程。比如前面的將數據庫表的數據導出到一個文件中,可以在SSMS中執行如下sql語句

exec master..xp_cmdshell 'bcp AdventureWorks.Sales.Currency out c:\Currency.dat -T -c'

假如你在執行上述語句的時候報如下錯誤:

SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online.

你可以通過執行如下語句來解決問題:參考:xp_cmdshell Option

複製代碼

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章