Share via


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_columnsbcp_setcolfmt,就會發生順序錯誤。

    如果您在呼叫 bcp_control(hdbc, BCPDELAYREADFMT, (void *)TRUE) 和 bcp_writefmt 之後呼叫 bcp_control(hdbc, BCPDELAYREADFMT, (void *)FALSE),也會發生順序錯誤。

    如需詳細資訊,請參閱<中繼資料探索>。

  • 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)。 110 是預設值。 這個值在使用舊版伺服器支援的格式匯出和匯入資料時非常實用。 例如,如果要將從 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 時,這個選項會指定以字元格式所儲存的 datetimesmalldatetime 值使用 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);

請參閱

參考

大量複製函數