1. 程式人生 > >BCP工具的使用以及C++,SQL server資料庫中呼叫命令列的方法

BCP工具的使用以及C++,SQL server資料庫中呼叫命令列的方法

BCP工具使用:

BCP是由SYBASE公司提供的,專門用於資料庫表一級資料備份的工具。
主要引數如下:
在這裡插入圖片描述
基本用法:

遠端地址1的資料庫表student 匯出到本地(遠端ip1(10.189.1.1) ):
bcp run.dbo.student out "c:\student .txt" -c  -S 10.189.1.1 -U user -P 123456
本地表student 匯入到遠端地址2(遠端ip2(10.189.1.2) ):
bcp run.dbo.student out "c:\student .txt" -c  -S 10.189.1.2 -U user -P 123456

-c 表示以字元形式輸出
-s 是伺服器地址
-u 伺服器使用者名稱
-P 資料庫使用者密碼
如果需要用特定字元將資料庫表字段分開,則需要加上引數-t ‘#’

bcp run.dbo.student out "c:\student .txt" -c  -S 10.189.1.1 -U user -P 123456 -t '#'

C++程式碼中進行BCP呼叫:

如果需要一些批處理操作,可能就需要再C++程式碼中進行BCP的呼叫,於是也順便研究了一下。
可以使用c++ system()和WinExec()進行呼叫。

#include <iostream>
#include <windows.h> //WinExec和system均需求這個標頭檔案
using namespace std;

int main()
{
    for(int i=0;i<3;i++){
        //WinExec函式在執行時,會順序執行接下來的程式碼,不管其cmd指令是否執行完成;
        //WinExec("bcp",SW_NORMAL);
        system函式在執行時,不會順序執行接下來的程式碼,而會停留在system語句上,直到cmd指令執行完畢;
        system("bcp");
    }
    return 0;
}

system(“bcp”);同步呼叫結果:
在這裡插入圖片描述
WinExec(“bcp”,SW_NORMAL);非同步呼叫結果:
在這裡插入圖片描述
可以看到非同步呼叫顯示的結果可能會是亂的,執行幾次的結果可能都不一樣。
這兩個方法需要根據不同的需求使用。

SQL 中使用儲存過程xp_cmdshell呼叫cmd命令

既然C++可以呼叫命令列,那麼SQL SERVER中應該也可以。
然後去查了下資料,果然是有方法的,於是也學習了一下。
使用方法:

EXEC xp_cmdshell 'mkdir d:\myfile',no_output --[no_output]表示是否輸出資訊

資料庫直接執行會有以下報錯:
在這裡插入圖片描述


所以需要先開啟資料的高階安全配置屬性。而開啟xp_cmdshell需要先啟用show advanced options。
資料庫預設這兩個屬性都是關閉的。

SELECT * FROM sys.configurations WHERE name='xp_cmdshell' OR name='show advanced options'

在這裡插入圖片描述
所以需要先依次把他們的value值設定為1。

EXEC sp_configure 'show advanced options',1 --啟用xp_cmdshell的高階配置
GO
RECONFIGURE --重新整理配置
GO
EXEC sp_configure 'xp_cmdshell',1  --開啟xp_cmdshell,可以呼叫SQL系統之外的命令
GO
RECONFIGURE --重新整理配置
EXEC xp_cmdshell 'bcp' --[no_output]表示是否輸出資訊

資料庫中呼叫bcp命令列的結果如下:
在這裡插入圖片描述