bcp_control
針對檔案和 SQL Server 之間的大量複製,變更各種控制項參數的預設設定。
語法
RETCODE bcp_control (
HDBC hdbc,
INT eOption,
void* iValue);
引數
hdbc
這是已啟用大量複製的 ODBC 連接控制代碼。eOption
為下列其中一項:BCPABORT
停止已經進行的大量複製作業。您可以用 BCPABORT 的 eOption,從另一個執行緒呼叫 bcp_control 以停止正在執行的大量複製作業。iValue 參數會被忽略。BCPBATCH
這是每一批次中的資料列數目。預設值為 0,這表示在擷取資料時,會指出資料表中的所有資料列,或在資料複製到 SQL Server 時,會指出使用者資料檔中的所有資料列。小於 1 的值會重設 BCPBATCH 為預設值。BCPFILECP
iValue 包含資料檔的字碼頁數目。您可以指定字碼頁的數目,例如 1252 或 850,或以下任一個值:BCPFILE_ACP:檔案中的資料位於用戶端的 Microsoft Windows® 字碼頁。
BCPFILE_OEMCP:檔案中的資料位於用戶端的 OEM 字碼頁 (預設值)。
BCPFILE_RAW:檔案中的資料位於 SQL Server 的字碼頁。
BCPFILEFMT
資料檔格式的版本號碼。可以是 70 (SQL Server 7.0)、80 (SQL Server 2000)、90 (SQL Server 2005) 和 100 (SQL Server 2008)。預設值為 100,且指出檔案使用 SQL Server 2008 格式。這對於以舊版伺服器所支援的格式匯出和匯入資料很有用。例如,如果要將從 SQL Server 2000 伺服器的文字資料行所取得的資料匯入至 SQL Server 2005 或更新版伺服器的 varchar(max) 資料行,應該指定 80。同樣地,如果您從 varchar(max) 資料行匯出資料時將版本號碼指定為 80,則資料會以儲存在 SQL Server 2000 格式中的文字資料行一樣的格式儲存,並且可以匯入至 SQL Server 2000 伺服器的文字資料行。BCPFIRST
這是要複製的檔案或資料表的第一個資料列。預設值為 1,小於 1 的值會將這個選項重設為預設值。BCPFIRSTEX
針對 BCP Out 作業,指定要複製到資料檔的資料庫資料表第一個資料列。如果是 BCP In 作業,則指定將資料檔案的第一個資料列複製到資料庫資料表中。
iValue 參數必須是包含值的 64 位元帶正負號整數之位址。可傳遞至 BCPFIRSTEX 的最大值為 2^63-1。
BCPFMTXML
指定所產生的格式檔案應該是 XML 格式。預設為關閉。XML 格式檔案提供更高的彈性,但是需要加入一些條件約束。例如,您不可以同時指定欄位的前置詞和結束字元,即使在舊版的格式檔案中可以這麼做。
[!附註]
XML 格式檔案只有在 SQL Server 與 SQL Server Native Client 一起安裝時才受到支援。
BCPHINTS
iValue 包含 SQLTCHAR 字元字串指標。定址的字串會指定處理提示的 SQL Server 大量複製或傳回結果集的 Transact-SQL 陳述式。如果 Transact-SQL 陳述式指定為傳回一個以上的結果集,則第一個結果集之後的所有結果集都會被忽略。如需有關大量複製處理提示的詳細資訊,請參閱<bcp 公用程式>。BCPKEEPIDENTITY
當 iValue 為 TRUE 時,這個選項會指定大量複製函數插入提供給由識別條件約束所定義之 SQL Server 資料行的資料值。輸入檔案必須提供識別資料行的值。如果沒有設定,就會為插入的資料列產生新的識別值。檔案中識別資料行的任何資料都會遭到忽略。BCPKEEPNULLS
指定檔案中的空白資料值是否會在 SQL Server 資料表中轉換為 NULL 值。當 iValue 為 TRUE 時,空白值在 SQL Server 資料表中會轉換為 NULL。預設是讓空白值在 SQL Server 資料表中轉換為資料行的預設值 (如果有預設)。BCPLAST
這是要複製的最後一個資料列。預設是複製所有的資料列;小於 1 的值會將這個選項重設為預設值。BCPLASTEX
針對 BCP Out 作業,指定要複製到資料檔的資料庫資料表最後一個資料列。如果是 BCP In 作業,則指定將資料檔案的最後一個資料列複製到資料庫資料表中。
iValue 參數必須是包含值的 64 位元帶正負號整數之位址。可傳遞至 BCPLASTEX 的最大值是 2^63-1。
BCPMAXERRS
這是在大量複製作業失敗之前所允許的錯誤數目。預設值為 10,小於 1 的值會將這個選項重設為預設值。大量複製最多會產生 65,535 個錯誤。如果嘗試將這個選項的值設定為大於 65,535,則該選項會設定為 65,535。BCPODBC
當設定為 TRUE 時,這個選項會指定以字元格式所儲存的 datetime 和 smalldatetime 値使用 ODBC 時間戳記逸出序列前置詞和後置詞。BCPODBC 選項只適用於 BCP_OUT。當設定為 FALSE 時,代表 1997 年 1 月 1 日的 datetime 値會轉換成字元字串:1997-01-01 00:00:00.000。當設定為 TRUE 時,相同的 datetime 値會表示為:{ts '1997-01-01 00:00:00.000'}。
BCPROWCOUNT
傳回受到目前 (或最近) BCP 作業影響的資料列數目。BCPTEXTFILE
當設定為 TRUE 時,這個選項會指定資料檔為文字檔,而不是二進位檔。如果檔案為文字檔,則 BCP 會藉由在資料檔的頭 2 個位元組中檢查 Unicode 位元組標記,判斷文字檔是否為 Unicode。BCPUNICODEFILE
當設定為 TRUE 時,這個選項會指定輸入檔為 Unicode 檔案格式。iValue
這是所指定 eOption 的値。iValue 是轉換成 Void 指標的整數 (LONGLONG) 値,未來可擴充為 64 位元的值。
傳回值
SUCCEED 或 FAIL。
備註
此函數會設定各種大量複製作業的控制參數,包含取消大量複製之前所允許的錯誤次數、從資料檔複製的第一個和最後一個資料列的數目,以及批次大小。
從 SQL Server 大量複製 SELECT 的結果集時,這個函數也可用來指定 SELECT 陳述式。將 eOption 設定為 BCPHINTS,並且將 iValue 設定為具有指向 SQLTCHAR 字串 (包含 SELECT 陳述式) 的指標。
只有在使用者檔案和 SQL Server 資料表之間進行複製時,這些控制項參數才有意義。控制項參數設定對於使用 bcp_sendrow 複製到 SQL Server 的資料列沒有影響。
範例
// Variables like henv not specified.
SQLHDBC hdbc;
DBINT nRowsProcessed;
// Application initiation, get an ODBC environment handle, allocate the
// hdbc, and so on.
...
// Enable bulk copy prior to connecting on allocated hdbc.
SQLSetConnectAttr(hdbc, SQL_COPT_SS_BCP, (SQLPOINTER) SQL_BCP_ON,
SQL_IS_INTEGER);
// Connect to the data source, return on error.
if (!SQL_SUCCEEDED(SQLConnect(hdbc, _T("myDSN"), SQL_NTS,
_T("myUser"), SQL_NTS, _T("myPwd"), SQL_NTS)))
{
// Raise error and return.
return;
}
// Initialize bulk copy.
if (bcp_init(hdbc, _T("address"), _T("address.add"), _T("addr.err"),
DB_IN) == FAIL)
{
// Raise error and return.
return;
}
// Set the number of rows per batch.
if (bcp_control(hdbc, BCPBATCH, (void*) 1000) == FAIL)
{
// Raise error and return.
return;
}
// Set file column count.
if (bcp_columns(hdbc, 1) == FAIL)
{
// Raise error and return.
return;
}
// Set the file format.
if (bcp_colfmt(hdbc, 1, 0, 0, SQL_VARLEN_DATA, '\n', 1, 1)
== FAIL)
{
// Raise error and return.
return;
}
// Execute the bulk copy.
if (bcp_exec(hdbc, &nRowsProcessed) == FAIL)
{
// Raise error and return.
return;
}
printf_s("%ld rows processed by bulk copy.", nRowsProcessed);