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 為預設值。
BCPDELAYREADFMT
如果設定為 true,布林值會導致 bcp_readfmt 在執行時讀取。 如果為 false (預設) ,bcp_readfmt會立即讀取格式檔案。 如果 BCPDELAYREADFMT 為 true,而且您呼叫 bcp_columns 或 bcp_setcolfmt,就會發生順序錯誤。
如果您在呼叫 BCPDELAYREADFMT 並bcp_writefmt之後呼叫 bcp_control(hdbc,
bcp_control(hdbc,
BCPDELAYREADFMT , (void *)FALSE)
, (void *)TRUE)
,也會發生順序錯誤。
如需詳細資訊,請參閱中繼資料探索。
BCPFILECP
iValue 包含資料檔案的字碼頁數目。 您可以指定字碼頁的數目,例如 1252 或 850,或以下任一個值:
BCPFILE_ACP:檔案中的資料位於 Microsoft Windows 中?? 用戶端的字碼頁。
BCPFILE_OEMCP:檔案中的資料位於用戶端的 OEM 字碼頁 (預設值)。
BCPFILE_RAW:檔案中的資料位於SQL Server的字碼頁。
BCPFILEFMT
資料檔案格式的版本號碼。 這可以是 80 (SQL Server 2000) 、90 (SQL Server 2005) 、100 (SQL Server 2008 或 SQL Server 2008 R2) 、110 (SQL Server 2012) 或 120 (SQL Server 2014) 。 120 是預設值。 這個值在使用舊版伺服器支援的格式匯出和匯入資料時非常實用。 例如,若要將從 SQL Server 2000 伺服器中文字資料行取得的資料匯入 SQL Server 2005 或更新版本中的 Varchar (max) 資料行,您應該指定 80。 同樣地,如果您在從Varchar (max) 資料行匯出資料時指定 80,則會儲存,就像文字資料行以 2000 SQL Server 2000 格式儲存,而且可以匯入SQL Server 2000 伺服器的文字資料行。
BCPFIRST
這是要複製的檔案或資料表的第一個資料列。 預設值為 1,小於 1 的值會將這個選項重設為預設。
BCPFIRSTEX
如果是 BCP Out 作業,則指定將資料庫資料表第一個資料列複製到資料檔案中。
如果是 BCP In 作業,則指定將資料檔案的第一個資料列複製到資料庫資料表中。
iValue參數必須是包含值的帶正負號 64 位整數的位址。 可傳遞至 BCPFIRSTEX 的最大值為 2^63-1。
BCPFMTXML
指定所產生的格式檔案應該是 XML 格式。 預設為關閉。
XML 格式檔案提供更高的彈性,但是需要加入一些條件約束。 例如,您不可以同時指定欄位的前置詞和結束字元,即使在舊版的格式檔案中可以這麼做。
注意
只有在SQL Server與SQL Server Native Client一起安裝時,才支援 XML 格式檔案。
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 日的 日期時間 值會轉換成字元字串:1997-01-01 00:00:00.000。 若為 TRUE,則表示相同的 日期時間 值:{ts '1997-01-01 00:00:00.000'}。
BCPROWCOUNT
傳回受到目前 (或最近) BCP 作業影響的資料列數目。
BCPTEXTFILE
當設定為 TRUE 時,這個選項會指定資料檔為文字檔,而不是二進位檔。 如果檔案為文字檔,則 BCP 會藉由在資料檔的頭 2 個位元組中檢查 Unicode 位元組標記,判斷文字檔是否為 Unicode。
BCPUNICODEFILE
當設定為 TRUE 時,這個選項會指定輸入檔為 Unicode 檔案格式。
iValue
這是指定 之 eOption的值。 iValue 是一個整數 (LONGLONG) 值轉換成 void 指標,以允許未來擴充為 64 位值。
傳回
SUCCEED 或 FAIL。
備註
此函數會設定各種大量複製作業的控制參數,包含取消大量複製之前所允許的錯誤次數、從資料檔複製的第一個和最後一個資料列的數目,以及批次大小。
從 SELECT 的結果集大量複製SQL Server時,也會使用此函式來指定 SELECT 語句。 將 eOption 設定為 BCPHINTS,並將 iValue 設定為具有包含 SELECT 語句之 SQLTCHAR 字串的指標。
只有在使用者檔案與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);