bcp_colfmt

指定用户文件中的数据的源或目标格式。作为源格式使用时,bcp_colfmt 指定在到 SQL Server 表的大容量复制中用作数据源的现有数据文件的格式。作为目标格式使用时,使用通过 bcp_colfmt 指定的列格式来创建数据文件。

语法

RETCODE bcp_colfmt (
        HDBC hdbc,
        INT idxUserDataCol,
        BYTE eUserDataType,
        INT cbIndicator,
        DBINT cbUserData,
        LPCBYTE pUserDataTerm,
        INT cbUserDataTerm,
        INT idxServerCol);

参数

  • hdbc
    支持大容量复制的 ODBC 连接句柄。

  • idxUserDataCol
    正在为其指定格式的用户数据文件中的列序号。第一列为 1。

  • eUserDataType
    用户文件中该列的数据类型。如果与数据库表 (idxServerColumn) 中的相应列的数据类型不同,则大容量复制将在可能时转换该数据。

    SQL Server 2005 在 eUserDataType 参数中引入了对 SQLXML 和 SQLUDT 数据类型令牌的支持。

    eUserDataType 参数由 sqlncli.h 中的 SQL Server 数据类型令牌而不是 ODBC C 数据类型枚举器进行枚举。例如,可以使用特定于 SQL Server 的类型 SQLCHARACTER 来指定一个 ODBC 类型 SQL_C_CHAR 的字符串。

    若要指定 SQL Server 数据类型的默认数据表示形式,请将该参数设置为 0。

    eUserDataType 为 SQLDECIMAL 或 SQLNUMERIC 时,对于从 SQL Server 到文件的大容量复制:

    • 如果源列的数据类型不是 decimalnumeric,则使用默认的精度和小数位数。

    • 如果源列的数据类型是 decimalnumeric,则使用源列的精度和小数位数。

  • cbIndicator
    列数据中的长度/Null 指示器的长度(字节)。有效指示器长度值是 0(不使用任何指示器时)、1、2、4 或 8。

    若要指定默认的大容量复制指示器用法,请将该参数设置为 SQL_VARLEN_DATA。

    指示器出现在内存中紧靠任何数据之前,并出现在数据文件中紧靠应用它们的数据之前。

    如果使用多种方式指定数据文件列长度(例如指示器和最大列长度,或指示器和终止符序列),则大容量复制将选择导致数据复制量最少的那种方式。

    用户未干预数据格式的调整时大容量复制所生成的数据文件,将包含列数据的长度可以变化或者列可以接受 NULL 作为值时的指示器。

  • cbUserData
    用户文件中该列数据的最大长度(字节),不包括任何长度指示器或终止符的长度。

    如果将 cbUserData 设置为 SQL_NULL_DATA,则指示数据文件列中的所有值已经或应当设置为 NULL。

    如果将 cbUserData 设置为 SQL_VARLEN_DATA,则指示系统应当确定每个列中的数据长度。对于某些列,这可能意味着将生成一个长度/Null 指示器,并将其放在从 SQL Server 产生的副本数据的前面,或期望将指示器放在复制到 SQL Server 的数据中。

    对于 SQL Server 字符和二进制数据类型,cbUserData 可以是 SQL_VARLEN_DATA、SQL_NULL_DATA、0 或某个正值。如果 cbUserData 为 SQL_VARLEN_DATA,则系统使用长度指示器(如果有)或终止符序列来确定数据的长度。如果同时提供了长度指示器和终止符序列两种方式,则大容量复制将使用导致数据复制量最少的那种方式。如果 cbUserData 为 SQL_VARLEN_DATA,而且数据类型为 SQL Server 字符或二进制类型,并且长度指示器和终止符序列都未指定,则系统返回错误消息。

    如果 cbUserData 为 0 或正值,则系统使用 cbUserData 作为最大数据长度。但是,如果除了正的 cbUserData 以外,还提供了长度指示器或终止符序列,则系统使用导致数据复制量最少的方法来确定数据长度。

    cbUserData 值表示数据的字节计数。如果字符数据由 Unicode 宽字符表示,则正的 cbUserData 参数值表示字符数乘以每个字符大小(字节)。

  • pUserDataTerm
    要用于该列的终止符序列。该参数主要对字符数据类型有用,因为所有其他类型都有固定的长度,或(在二进制数据的情况下)需要长度指示器以准确记录所出现的字节数。

    若要避免终止所提取的数据,或指示用户文件中的数据未终止,请将该参数设置为 NULL。

    如果使用多种方式(例如终止符和长度指示器,或终止符和最大列长度)指定用户文件的列长度,则大容量复制将选择导致数据复制量最少的那种方式。

    大容量复制 API 根据需要执行 Unicode 到 MBCS 的字符转换。必须小心确保终止符字节字符串和字节字符串的长度二者均已正确设置。

  • cbUserDataTerm
    要用于该列的终止符序列的长度(字节)。如果终止符不存在或不希望其出现在数据中,请将该值设置为 0。

  • idxServerCol
    数据库表中列的序号位置。第一个列号是 1。列的序号位置由 SQLColumns 报告。

    如果该值是 0,则大容量复制将忽略数据文件中的该列。

返回值

SUCCEED 或 FAIL。

注释

通过 bcp_colfmt 函数可以指定大容量复制的用户文件格式。对于大容量复制,格式包含以下部分:

  • 从用户文件列映射到数据库列。

  • 每个用户文件列的数据类型。

  • 每个列的可选指示器的长度。

  • 每个用户文件列的数据最大长度。

  • 每个列的可选终止字节序列。

  • 可选终止字节序列的长度。

bcp_colfmt 的每次调用都要指定一个用户文件列的格式。例如,若要在五列用户数据文件中更改三个列的默认设置,请首先调用 bcp_columns(5),然后调用 bcp_colfmt 五次,其中三次调用将设置自定义格式。对于剩余的两次调用,请将 eUserDataType 设置为 0,并将 cbIndicatorcbUserDatacbUserDataTerm 分别设置为 0、SQL_VARLEN_DATA 和 0。该过程复制所有五个列,其中三个使用自定义格式,两个使用默认格式。

对于 cbIndicator,值为 8 指示大值类型现在有效。如果为其相应列是新的 max 类型的字段指定了前缀,则只能将它设置为 8。有关详细信息,请参阅bcp_bind

在对 bcp_colfmt 进行任何调用之前,必须先调用 bcp_columns 函数。

必须对用户文件中的每个列调用一次 bcp_colfmt

对任何用户文件列多次调用 bcp_colfmt 将导致错误。

不需要将用户文件中的所有数据都复制到 SQL Server 表。若要跳过某列,请指定列的数据格式,同时将 idxServerCol 参数设置为 0。如果要跳过某列,必须指定其类型。

bcp_writefmt 函数可以用于使格式指定方式持久化。

对增强的日期和时间功能的 bcp_colfmt 支持

有关用于日期/时间类型的 eUserDataType 参数的类型的信息,请参阅增强的日期/时间类型的大容量复制更改(OLE DB 和 ODBC)

有关详细信息,请参阅 日期/时间的改进 (ODBC)

请参阅

参考