從程式變數大量複製

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

您可以直接從程式變數大量複製。 配置變數以保存資料列的數據並呼叫 bcp_init 以啟動大量複製之後,請針對每個數據行呼叫 bcp_bind ,以指定要與數據行相關聯的程式變數位置和格式。 使用數據填入每個變數,然後呼叫 bcp_sendrow ,將一列數據傳送至伺服器。 重複填滿變數並呼叫 bcp_sendrow 的程式,直到所有數據列都傳送至伺服器為止,然後呼叫 bcp_done 以指定作業已完成。

bcp_bind pData 參數包含係結至數據行之變數的位址。 每個資料行的數據都可以以下列兩種方式之一儲存:

  • 配置一個變數來保存數據。

  • 配置指標變數,後面緊接著數據變數。

指標變數會指出可變長度數據行的數據長度,如果數據行允許 NUL,也會指出 NULL 值。 如果只使用數據變數,則此變數的位址會儲存在 pData 參數bcp_bind。 如果使用指標變數,指標變數,指標變數的位址會儲存在 bcp_bindpData 參數中。 大量複製函式會藉由新增 bcp_bind cbIndicatorpData 參數來計算數據變數的位置。

bcp_bind支援三種方法來處理可變長度的數據:

  • 只搭配數據變數使用 cbData 。 將數據的長度放在 cbData 中。 每次要大量複製的數據長度變更時,請呼叫 bcp_collen 來重設 cbData。 如果使用其他兩種方法之一,請為 cbData 指定SQL_VARLEN_DATA。 如果針對數據行提供的所有數據值都是 NULL,請為 cbData 指定SQL_NULL_DATA。

  • 使用指標變數。 當每個新的資料值移至資料變數時,請將該值的長度儲存在指標變數中。 如果使用其他兩種方法之一,請為 cbIndicator 指定 0。

  • 使用終止符指標。 使用終止數據的位模式位址載入bcp_bindpTerm 參數。 如果使用其他兩種方法之一,請為 pTerm 指定 NULL。

這三種方法都可以在同一個bcp_bind呼叫上使用,在此情況下會使用產生最少複製數據的規格。

bcp_bind類型參數會使用 DB-Library 數據類型標識碼,而不是 ODBC 數據類型識別碼。 DB-Library 數據類型標識符定義於 sqlncli.h 中,以搭配 ODBC bcp_bind 函式使用。

大量複製函式不支援所有 ODBC C 資料類型。 例如,大量複製函式不支援 ODBC SQL_C_TYPE_TIMESTAMP 結構,因此請使用 SQLBindColSQLGetData 將 ODBC SQL_TYPE_TIMESTAMP數據轉換成SQL_C_CHAR變數。 如果您接著使用 bcp_bind 搭配 SQLCHARACTER 的 type 參數,將變數系結至 SQL Server datetime 數據行,則大量複製函式會將字元變數中的時間戳逸出子句轉換成適當的 datetime 格式。

下表列出要用於從 ODBC SQL 數據類型對應到 SQL Server 數據類型的建議數據類型。

ODBC SQLdata 類型 ODBC C 數據類型 bcp_bind類型參數 SQL Server 資料類型
SQL_CHAR SQL_C_CHAR SQLCHARACTER character

char
SQL_VARCHAR SQL_C_CHAR SQLCHARACTER varchar

character varying

char varying

sysname
SQL_LONGVARCHAR SQL_C_CHAR SQLCHARACTER text
SQL_WCHAR SQL_C_WCHAR SQLNCHAR nchar
SQL_WVARCHAR SQL_C_WCHAR SQLNVARCHAR nvarchar
SQL_WLONGVARCHAR SQL_C_WCHAR SQLNTEXT ntext
SQL_DECIMAL SQL_C_CHAR SQLCHARACTER decimal

dec

money

smallmoney
SQL_NUMERIC SQL_C_NUMERIC SQLNUMERICN numeric
SQL_BIT SQL_C_BIT SQLBIT bit
SQL_TINYINT(已簽署) SQL_C_SSHORT SQLINT2 smallint
SQL_TINYINT (未簽署) SQL_C_UTINYINT SQLINT1 tinyint
SQL_SMALL_INT(已簽署) SQL_C_SSHORT SQLINT2 smallint
SQL_SMALL_INT (未簽署) SQL_C_SLONG SQLINT4 int

integer
SQL_INTEGER(已簽署) SQL_C_SLONG SQLINT4 int

integer
SQL_INTEGER (未簽署) SQL_C_CHAR SQLCHARACTER decimal

dec
SQL_BIGINT (已簽署與未簽署 ) SQL_C_CHAR SQLCHARACTER bigint
SQL_REAL SQL_C_FLOAT SQLFLT4 real
SQL_FLOAT SQL_C_DOUBLE SQLFLT8 float
SQL_DOUBLE SQL_C_DOUBLE SQLFLT8 float
SQL_BINARY SQL_C_BINARY SQLBINARY binary

timestamp
SQL_VARBINARY SQL_C_BINARY SQLBINARY varbinary

binary varying
SQL_LONGVARBINARY SQL_C_BINARY SQLBINARY image
SQL_TYPE_DATE SQL_C_CHAR SQLCHARACTER datetime

smalldatetime
SQL_TYPE_TIME SQL_C_CHAR SQLCHARACTER datetime

smalldatetime
SQL_TYPE_TIMESTAMP SQL_C_CHAR SQLCHARACTER datetime

smalldatetime
SQL_GUID SQL_C_GUID SQLUNIQUEID uniqueidentifier
SQL_INTERVAL_ SQL_C_CHAR SQLCHARACTER char

SQL Server 沒有已簽署 的 tinyint、unsigned smallint 或 unsigned int 數據類型。 若要避免在移轉這些數據類型時遺失數據值,請建立具有下一個最大整數數據類型的 SQL Server 數據表。 若要防止使用者稍後新增原始數據類型所允許範圍以外的值,請將規則套用至 SQL Server 數據行,以將允許的值限制為原始來源中數據類型所支援的範圍:

CREATE TABLE Sample_Ints(STinyIntCol   SMALLINT,  
USmallIntCol INT)  
GO  
CREATE RULE STinyInt_Rule  
AS   
@range >= -128 AND @range <= 127  
GO  
CREATE RULE USmallInt_Rule  
AS   
@range >= 0 AND @range <= 65535  
GO  
sp_bindrule STinyInt_Rule, 'Sample_Ints.STinyIntCol'  
GO  
sp_bindrule USmallInt_Rule, 'Sample_Ints.USmallIntCol'  
GO  

SQL Server 不支援直接的間隔數據類型。 不過,應用程式可以將間隔逸出序列儲存為 SQL Server 字元數據行中的字元字串。 應用程式可以讀取它們以供日後使用,但無法在 Transact-SQL 語句中使用。

大量複製函式可用來將數據快速載入已從 ODBC 數據源讀取的 SQL Server。 使用 SQLBindCol 將結果集的數據行系結至程式變數,然後使用 bcp_bind 將相同的程式變數系結至大量複製作業。 呼叫 SQLFetchScrollSQLFetch ,然後將 ODBC 數據源中的數據列擷取至程式變數,並呼叫 bcp_sendrow 大量將數據從程式變數複製到 SQL Server 。

每當應用程式需要變更原本在 bcp_bindpData 參數中指定的數據變數位址時,就可以使用 bcp_colptr 函式。 應用程式可以隨時使用 bcp_collen 函式來變更原本在 bcp_bindcbData 參數中指定的數據長度。

您無法使用大量複製將數據從 SQL Server 讀取到程式變數;沒有任何類似「bcp_readrow」函式。 您只能將資料從應用程式傳送至伺服器。

另請參閱

執行大量複製作業 (ODBC)