从程序变量执行大容量复制

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

可以直接从程序变量执行大容量复制。 分配变量以保存行的数据并调用 bcp_init 以启动大容量复制后,请为每个列调用 bcp_bind ,以指定要与列关联的程序变量的位置和格式。 使用数据填充每个变量,然后调用 bcp_sendrow 将一行数据发送到服务器。 重复填充变量并调用 bcp_sendrow 的过程,直到所有行都发送到服务器,然后调用 bcp_done 以指定操作已完成。

bcp_bindpData 参数包含绑定到列的变量的地址。 每列的数据都可以通过以下两种方式之一存储:

  • 分配一个变量以保存数据。

  • 分配指示器变量,后面紧随数据变量。

指示器变量指示可变长度列的数据长度,如果列允许 NULL 值,还指示 NULL 值。 如果仅使用数据变量,则此变量的地址存储在 bcp_bindpData 参数中。 如果使用指示器变量,则指示器变量的地址存储在 bcp_bindpData 参数中。 大容量复制函数通过添加 bcp_bindcbIndicatorpData 参数来计算数据变量的位置。

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 库数据类型标识符,而不是 ODBC 数据类型标识符。 DB-Library 数据类型标识符在 sqlncli.h 中定义,用于 ODBC bcp_bind 函数。

大容量复制函数并不支持所有 ODBC C 数据类型。 例如,大容量复制函数不支持 ODBC SQL_C_TYPE_TIMESTAMP 结构,因此请使用 SQLBindColSQLGetData 将 ODBC SQL_TYPE_TIMESTAMP 数据转换为SQL_C_CHAR变量。 如果使用 SQLCHARACTER 的类型参数bcp_bind将变量绑定到 SQL Server 日期/时间列,则大容量复制函数会将字符变量中的时间戳转义子句转换为正确的日期/时间格式。

下表列出了用于从 ODBC SQL 数据类型映射到 SQL Server 数据类型的建议数据类型。

ODBC SQL 数据类型 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 图像
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_colptr 函数来更改最初在 bcp_bind pData 参数中指定的数据变量的地址。 应用程序随时可以使用 bcp_collen 函数来更改最初在 bcp_bindcbData 参数中指定的数据长度。

不能使用大容量复制将数据从 SQL Server 读取到程序变量中;没有什么像“bcp_readrow”函数。 只能将数据从应用程序发送到服务器。

另请参阅

执行大容量复制操作 (ODBC)