從程式變數大量複製
適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics 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 cbIndicator 和 pData 參數來計算數據變數的位置。
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 結構,因此請使用 SQLBindCol 或 SQLGetData 將 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 將相同的程式變數系結至大量複製作業。 呼叫 SQLFetchScroll 或 SQLFetch ,然後將 ODBC 數據源中的數據列擷取至程式變數,並呼叫 bcp_sendrow 大量將數據從程式變數複製到 SQL Server 。
每當應用程式需要變更原本在 bcp_bind pData 參數中指定的數據變數位址時,就可以使用 bcp_colptr 函式。 應用程式可以隨時使用 bcp_collen 函式來變更原本在 bcp_bindcbData 參數中指定的數據長度。
您無法使用大量複製將數據從 SQL Server 讀取到程式變數;沒有任何類似「bcp_readrow」函式。 您只能將資料從應用程式傳送至伺服器。