Uso de tipos de datos XML en clientes nativos de SQL Server

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Importante

SQL Server Native Client (a menudo abreviado SNAC) se ha quitado de SQL Server 2022 (16.x) y SQL Server Management Studio 19 (SSMS). No se recomienda SQL Server Native Client (SQLNCLI o SQLNCLI11) ni el proveedor OLE DB de Microsoft heredado para SQL Server (SQLOLEDB) para el desarrollo de nuevas aplicaciones. Cambie al nuevo controlador OLE DB de Microsoft (MSOLEDBSQL) para SQL Server o al controlador ODBC de Microsoft ODBC Driver for SQL Server más reciente de ahora en adelante. Para SQLNCLI que se incluye como componente de SQL Server motor de base de datos (versiones 2012 a 2019), consulte esta excepción de ciclo de vida de soporte técnico.

En SQL Server 2005 (9.x), se ha introducido un tipo de datos xml que permite almacenar fragmentos y documentos XML en una base de datos de SQL Server. El tipo de datos xml es un tipo de datos integrado en SQL Server y es de algún modo similar a otros tipos integrados, como int y varchar. Al igual que ocurre con otros tipos integrados, el tipo de datos xml puede usarse como un tipo de columna al crear una tabla, como un tipo de variable, un tipo de parámetro, un tipo de valor devuelto por una función o en funciones CAST y CONVERT.

Consideraciones sobre la programación

El XML puede ser autodescriptivo ya que puede incluir un encabezado XML que especifique la codificación del documento como, por ejemplo:

<?xml version="1.0" encoding="windows-1252"?><doc/>

El estándar XML describe la forma en que un procesador XML puede detectar la codificación usada en un documento examinando los primeros bytes del documento. Hay ocasiones en que la codificación especificada por la aplicación entra en conflicto con la codificación especificada por el documento. En el caso de los documentos que se pasan como parámetros enlazados, SQL Server trata el XML como datos binarios, por lo que no se realiza ninguna conversión y el analizador XML puede usar la codificación especificada en el documento sin problemas. Sin embargo, en el caso de los datos XML enlazados como WSTR, la aplicación debe asegurarse de que el documento esté codificado como Unicode. Esto puede implicar la carga del documento en un DOM, el cambio de la codificación a Unicode y la serialización del documento. Si no se llevan a cabo estas operaciones, pueden producirse conversiones de datos, lo que daría lugar a un XML no válido o dañado.

También pueden surgir conflictos cuando el XML se especifica en literales. Por ejemplo, las siguientes instrucciones no son válidas:

INSERT INTO xmltable(xmlcol) VALUES('<?xml version="1.0" encoding="UTF-16"?><doc/>')

INSERT INTO xmltable(xmlcol) VALUES(N'<?xml version="1.0" encoding="UTF-8"?><doc/>')

Proveedor OLE DB de SQL Server Native Client

DBTYPE_XML es un nuevo tipo de datos específico de XML en el proveedor OLE DB de SQL Server Native Client. Además, puede obtenerse acceso a los datos XML a través de los tipos OLE DB existentes DBTYPE_BYTES, DBTYPE_WSTR, DBTYPE_BSTR, DBTYPE_XML, DBTYPE_STR, DBTYPE_VARIANT y DBTYPE_IUNKNOWN. Los datos almacenados en columnas de tipo XML se pueden recuperar de una columna en un conjunto de filas del proveedor OLE DB de SQL Server Native Client en los formatos siguientes:

  • Una cadena de texto

  • Un elemento ISequentialStream

Nota:

El proveedor OLE DB de SQL Server Native Client no incluye un lector SAX, pero ISequentialStream se puede pasar fácilmente a objetos SAX y DOM en MSXML.

ISequentialStream debe usarse para la recuperación de documentos XML grandes. Las mismas técnicas que se usan para otros tipos de valores grandes también se aplican a XML. Para más información, consulte Usar tipos de valor grande.

Una aplicación también puede recuperar, insertar o actualizar datos almacenados en columnas de tipo XML de un conjunto de filas mediante las interfaces habituales, como IRow::GetColumns, IRowChange::SetColumns e ICommand::Execute. De forma similar al caso de recuperación, un programa de aplicación puede pasar una cadena de texto o un ISequentialStream al proveedor OLE DB de SQL Server Native Client.

Nota:

Para enviar datos XML en formato de cadena mediante la interfaz ISequentialStream, tiene que obtener ISequentialStream especificando DBTYPE_IUNKNOWN y establecer su argumento pObject en NULL en el enlace.

Cuando los datos XML recuperados se truncan debido a que el búfer del consumidor es demasiado pequeño, la longitud puede devolverse como 0xffffffff, lo que significa que no se conoce la longitud. Esto es coherente con su implementación como un tipo de datos que se transmite por secuencias al cliente sin enviar la información de longitud antes que los datos reales. En algunos casos, la longitud real se puede devolver cuando el proveedor ha almacenado en búfer todo el valor, como IRowset::GetData y donde se realiza la conversión de datos.

El servidor trata los datos XML enviados a SQL Server como datos binarios. Esto impide que se produzcan conversiones y permite al analizador XML detectar automáticamente la codificación XML. De esta forma puede aceptarse una mayor variedad de documentos XML como entrada para SQL Server (por ejemplo, los documentos codificados en UTF-8).

Si el XML de entrada se enlaza como DBTYPE_WSTR, la aplicación debe asegurarse de que se trata de Unicode codificado para evitar cualquier posibilidad de que se produzcan daños a causa de conversiones de datos no deseadas.

Enlaces y conversiones de datos

En la tabla siguiente, se describen el enlace y la coerción que tienen lugar al usar los tipos de datos enumerados con el tipo de datos SQL Serverxmlde.

Tipo de datos A datos XML

XML
A datos XML

Distinto de XML
Desde datos XML

XML
Desde datos XML

Distinto de XML
DBTYPE_XML Paso a través6,7 Error1 Correcto11, 6 Error8
DBTYPE_BYTES Paso a través6,7 N/D2 Correcto11, 6 N/D 2
DBTYPE_WSTR Paso a través6,10 N/D 2 Correcto4, 6, 12 N/D 2
DBTYPE_BSTR Paso a través6,10 N/D 2 Correcto3 N/D 2
DBTYPE_STR Correcto6, 9, 10 N/D 2 Correcto5, 6, 12 N/D 2
DBTYPE_IUNKNOWN Flujo de bytes mediante ISequentialStream7 N/D 2 Flujo de bytes mediante ISequentialStream11 N/D 2
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) Paso a través6,7 N/D 2 N/D N/D 2
DBTYPE_VARIANT (VT_BSTR) Paso a través6,10 N/D 2 Correcto3 N/D 2

1Si se especifica un tipo de servidor distinto de DBTYPE_XML con ICommandWithParameters::SetParameterInfo y el tipo de descriptor de acceso es DBTYPE_XML, se produce un error cuando se ejecuta la instrucción (DB_E_ERRORSOCCURRED, el estado del parámetro es DBSTATUS_E_BADACCESSOR); de lo contrario, los datos se envían al servidor, pero este devuelve un error que indica que no hay ninguna conversión implícita de XML al tipo de datos del parámetro.

2 Más allá del ámbito de este tema.

3Formato UTF-16, sin marca de orden de bytes (BOM), sin especificación de codificación, sin terminación NULL.

4Formato UTF-16, sin marca BOM, sin especificación de codificación, con terminación NULL.

5Formato de caracteres multibyte codificados en la página de códigos de cliente con terminador NULL. La conversión del Unicode proporcionado por el servidor puede producir daños en los datos, de modo que no se recomienda utilizar este enlace.

6Puede usarse BY_REF.

7Los datos UTF-16 tienen que empezar con una marca BOM. Si no es así, es posible que el servidor no reconozca correctamente la codificación.

8La validación puede producirse en el momento de creación del descriptor de acceso o en el momento de la captura. El error es DB_E_ERRORSOCCURRED, con el estado de enlace establecido en DBBINDSTATUS_UNSUPPORTEDCONVERSION.

9Los datos se convierten a Unicode con la página de códigos del cliente antes de enviarse al servidor. Si la codificación del documento no coincide con la página de códigos del cliente, pueden producirse daños en los datos, por lo que no se recomienda usar este enlace.

10Siempre se agrega la marca BOM a los datos enviados al servidor. Si los datos ya comenzaban con una marca BOM, habrá dos marcas BOM al inicio del búfer. El servidor usa la primera marca BOM para reconocer la codificación como UTF-16 y, después, la descarta. La segunda marca se interpreta como un carácter de espacio de no separación de ancho cero.

11Formato UTF-16 sin especificación de codificación, se agrega una marca BOM a los datos recibidos del servidor. Aunque el servidor devuelva una cadena vacía, se devuelve una marca BOM a la aplicación. Si la longitud del búfer es un número de bytes impar, los datos se truncan correctamente. Si el valor completo se devuelve en fragmentos, estos pueden concatenarse para reconstituir el valor correcto.

12 Si la longitud del búfer es inferior a dos caracteres, es decir, no se notifica suficiente espacio para la terminación nula; se notifica un error de desbordamiento.

Nota:

Los valores XML NULL no devuelven ningún dato.

El estándar XML exige que el XML con codificación UTF-16 comience con una marca de orden de bytes (BOM), el código de carácter UTF-16 0xFEFF. Al trabajar con enlaces WSTR y BSTR, SQL Server Native Client no requiere ni agrega una BOM, ya que la codificación está implícita en el enlace. Cuando se trabaja con enlaces BYTES, XML o IUNKNOWN, se intenta proporcionar simplicidad a la hora de actuar con otros sistemas de almacenamiento y procesadores XML. En este caso, debe haber una marca BOM en el XML con codificación UTF-16 y la aplicación no necesita ocuparse de la codificación real, ya que la mayoría de los procesadores XML (incluido SQL Server) deducen la codificación inspeccionando los primeros bytes del valor. Los datos XML recibidos de SQL Server Native Client mediante enlaces BYTES, XML o IUNKNOWN siempre se codifican en UTF-16 con una boM y sin una declaración de codificación incrustada.

Las conversiones de datos que proporcionan los servicios principales de OLE DB (IDataConvert) no pueden aplicarse en DBTYPE_XML.

La validación se lleva a cabo cuando los datos se envían al servidor. La aplicación debe administrar los cambios de codificación y la validación en el cliente; además, se recomienda no procesar los datos XML directamente sino usar un lector DOM o SAX para procesarlos.

DBTYPE_NULL y DBTYPE_EMPTY pueden enlazarse en parámetros de entrada, pero no en parámetros de salida ni en resultados. Cuando se enlazan para parámetros de entrada, el estado debe establecerse en DBSTATUS_S_ISNULL o DBSTATUS_S_DEFAULT.

DBTYPE_XML puede convertirse en DBTYPE_EMPTY y DBTYPE_NULL, DBTYPE_EMPTY puede convertirse en DBTYPE_XML, pero DBTYPE_NULL no puede convertirse en DBTYPE_XML. Este comportamiento es coherente con el de DBTYPE_WSTR.

DBTYPE_IUNKNOWN es un enlace compatible (tal y como se mostraba en la tabla anterior), pero no hay ninguna conversión entre DBTYPE_XML y DBTYPE_IUNKNOWN. DBTYPE_IUNKNOWN no puede usarse con DBTYPE_BYREF.

Adiciones y cambios en los conjuntos de filas de OLE DB

SQL Server Native Client agrega nuevos valores o cambios a muchos de los conjuntos de filas de esquema OLE DB principales.

Los conjuntos de filas de esquema COLUMNS y PROCEDURE_PARAMETERS

Las adiciones a los conjuntos de filas de esquema COLUMNS y PROCEDURE_PARAMETERS incluyen las columnas siguientes.

Nombre de la columna Tipo Descripción
SS_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Nombre del catálogo donde se define una colección de esquemas XML. Es NULL para una columna no XML o una columna XML sin tipo.
SS_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Nombre de un esquema donde se define una colección de esquemas XML. Es NULL para una columna no XML o una columna XML sin tipo.
SS_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Nombre de la colección de esquemas XML. Es NULL para una columna no XML o una columna XML sin tipo.

El conjunto de filas de esquema PROVIDER_TYPES

En el conjunto de filas de esquema PROVIDER_TYPES, el valor de COLUMN_SIZE es 0 para el tipo de datos xml y DATA_TYPE es DBTYPE_XML.

El conjunto de filas de esquema SS_XMLSCHEMA

Se ha introducido un nuevo conjunto de filas de esquema SS_XMLSCHEMA para que los clientes recuperen información del esquema XML. El conjunto de filas SS_XMLSCHEMA contiene las columnas siguientes.

Nombre de la columna Tipo Descripción
SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Catálogo al que pertenece una colección XML.
SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Esquema al que pertenece una colección XML.
SCHEMACOLLECTIONNAME DBTYPE_WSTR Nombre de una colección de esquemas XML para columnas XML con tipo; de lo contrario, NULL.
TARGETNAMESPACEURI DBTYPE_WSTR Espacio de nombres de destino de un esquema XML.
SCHEMACONTENT DBTYPE_WSTR Contenido del esquema XML.

Los esquemas XML tienen como ámbito el nombre del catálogo, el nombre de esquema, el nombre de la colección de esquemas y el identificador uniforme de recursos (URI) del espacio de nombres de destino. También se define un nuevo GUID con el nombre DBSCHEMA_XML_COLLECTIONS. El número de restricciones y las columnas restringidas del conjunto de filas de esquema SS_XMLSCHEMA se definen tal y como se indica a continuación.

GUID Número de restricciones Columnas restringidas
DBSCHEMA_XML_COLLECTIONS 4 SCHEMACOLLECTION_CATALOGNAME

SCHEMACOLLECTION_SCHEMANAME

SCHEMACOLLECTIONNAME

TARGETNAMESPACEURI

Adiciones y cambios en los conjuntos de propiedades de OLE DB

SQL Server Native Client agrega nuevos valores o cambios a muchos de los conjuntos de propiedades OLE DB principales.

El conjunto de propiedades DBPROPSET_SQLSERVERPARAMETER

Para admitir el tipo de datos xml a través de OLE DB, SQL Server Native Client implementa el nuevo conjunto de propiedades DBPROPSET_SQLSERVERPARAMETER, que contiene los valores siguientes.

Nombre Tipo Descripción
SSPROP_PARAM_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Nombre del catálogo (base de datos) donde se define una colección de esquemas XML. Una de las partes del identificador de nombre de tres partes de SQL.
SSPROP_PARAM_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Nombre de un esquema XML de la colección de esquemas. Una de las partes del identificador de nombre de tres partes de SQL.
SSPROP_PARAM_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Nombre de la colección de esquemas XML del catálogo. Una de las partes del identificador de nombre de tres partes de SQL.

El conjunto de propiedades DBPROPSET_SQLSERVERCOLUMN

Para admitir la creación de tablas en la interfaz ITableDefinition, SQL Server Native Client agrega tres columnas nuevas al conjunto de propiedades DBPROPSET_SQLSERVERCOLUMN.

Nombre Tipo Descripción
SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME VT_BSTR Para las columnas XML con tipo, esta propiedad es una cadena que especifica el nombre del catálogo donde se almacena el esquema XML. Para otros tipos de columna, esta propiedad devuelve una cadena vacía.
SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME VT_BSTR Para las columnas XML con tipo, esta propiedad es una cadena que especifica el nombre del esquema XML que define esta columna.
SSPROP_COL_XML_SCHEMACOLLECTIONNAME VT_BSTR Para las columnas XML con tipo, esta propiedad es una cadena que especifica el nombre de la colección de esquemas XML que define el valor.

Al igual que los valores de SSPROP_PARAM, todas estas propiedades son opcionales y su valor predeterminado es una cadena vacía. SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME y SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME solo pueden especificarse si se especifica SSPROP_COL_XML_SCHEMACOLLECTIONNAME. Al pasar XML al servidor, si se incluyen estos valores se comprueba su existencia (validez) en la base de datos actual y los datos de instancia se comprueban en el esquema. En todos los casos, para ser válidos, deben estar todos vacíos o todos rellenos.

Adiciones y cambios en las interfaces de OLE DB

SQL Server Native Client agrega nuevos valores o cambios a muchas de las interfaces OLE DB principales.

La interfaz ISSCommandWithParameters

Para admitir el tipo de datos xml a través de OLE DB, SQL Server Native Client implementa varios cambios, incluida la adición de la interfaz ISSCommandWithParameters. Esta nueva interfaz hereda de la interfaz OLE DB básica ICommandWithParameters. Además de los tres métodos heredados de ICommandWithParameters; GetParameterInfo, MapParameterNames y SetParameterInfo; ISSCommandWithParameters proporciona los métodosGetParameterProperties y SetParameterProperties que se usan para controlar tipos de datos específicos del servidor.

Nota:

La interfaz ISSCommandWithParameters también usa la nueva estructura SSPARAMPROPS.

La interfaz IColumnsRowset

SQL Server Native Client agrega las siguientes columnas específicas de SQL Server al conjunto de filas devuelto por el método IColumnRowset::GetColumnsRowset. Estas columnas contienen el nombre de tres partes de una colección de esquemas XML. Para las columnas que no son XML o las columnas XML sin tipo, las tres columnas toman el valor predeterminado NULL.

Nombre de la columna Tipo Descripción
DBCOLUMN_SS_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Catálogo al que pertenece una colección de esquemas XML.

De lo contrario, NULL.
DBCOLUMN_SS_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Esquema al que pertenece una colección de esquemas XML. De lo contrario, NULL.
DBCOLUMN_SS_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Nombre de una colección de esquemas XML para columnas XML con tipo; de lo contrario, NULL.

La interfaz IRowset

La instancia XML de una columna XML se recupera a través del método IRowset::GetData. Una instancia XML puede recuperarse como DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML, DBTYPE_STR, DBTYPE_BYTES o como una interfaz a través de DBTYPE_IUNKNOWN, en función del enlace especificado por el cliente. Si el consumidor especifica DBTYPE_BSTR, DBTYPE_WSTR o DBTYPE_VARIANT, el proveedor convierte la instancia XML en el tipo solicitado por el usuario y la coloca en la ubicación especificada en el enlace correspondiente.

Si el consumidor especifica DBTYPE_IUNKNOWN y establece el argumento pObject en NULL o establece el argumento pObject en IID_ISequentialStream, el proveedor devuelve una interfaz ISequentialStream al consumidor para que este pueda transmitir los datos XML por secuencias fuera de la columna. Después, ISequentialStream devuelve los datos XML como una secuencia de caracteres Unicode.

Al devolver un valor XML enlazado a DBTYPE_IUNKNOWN, el proveedor notifica un valor de tamaño sizeof (IUnknown *). Observe que esto es coherente con el enfoque que se aplica al enlazar una columna como DBTYPE_IUnknown o DBTYPE_IDISPATCH y con el enfoque que aplica DBTYPE_IUNKNOWN/ISequentialStream cuando no puede determinarse el tamaño exacto de la columna.

La interfaz IRowsetChange

Un consumidor puede actualizar una instancia XML de una columna de dos formas. La primera, a través del objeto de almacenamiento ISequentialStream creado por el proveedor. El consumidor puede llamar al método ISequentialStream::Write para actualizar directamente la instancia XML devuelta por el proveedor.

La segunda, mediante los métodos IRowsetChange::SetData o IRowsetChange::InsertRow. En este enfoque, puede especificarse una instancia XML del búfer del consumidor en un enlace de tipo DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML o DBTYPE_IUNKNOWN.

En caso de DBTYPE_BSTR, DBTYPE_WSTR o DBTYPE_VARIANT, el proveedor almacena la instancia XML que reside en el búfer del consumidor en la columna apropiada.

En el caso de DBTYPE_IUNKNOWN/ISequentialStream, si el consumidor no especifica ningún objeto de almacenamiento, el consumidor debe crear un objeto ISequentialStream de antemano, enlazar el documento XML con el objeto y, a continuación, pasar el objeto al proveedor a través del método IRowsetChange::SetData . El consumidor también puede crear un objeto de almacenamiento, establecer el argumento pObject en IID_ISequentialStream, crear un objeto ISequentialStream y, después, pasar el objeto ISequentialStream al método IRowsetChange::SetData. En ambos casos, el proveedor puede recuperar el objeto XML a través del objeto ISequentialStream e insertarlo en una columna apropiada.

La interfaz IRowsetUpdate

La interfaz IRowsetUpdate proporciona funciones para las actualizaciones retrasadas. Los datos disponibles para los conjuntos de filas no están disponibles para otras transacciones hasta que el consumidor llame al método IRowsetUpdate:Update .

La interfaz IRowsetFind

El método IRowsetFind::FindNextRow no funciona con el tipo de datos xml. Cuando se llama a IRowsetFind::FindNextRow y el argumento hAccessor especifica una columna DBTYPE_XML, se devuelve DB_E_BADBINDINFO. Esto ocurre independientemente del tipo de columna que se esté buscando. En los demás tipos de enlaces, se produce un error en FindNextRow con DB_E_BADCOMPAREOP si el tipo de datos de la columna que va a buscarse es xml.

Controlador ODBC de SQL Server Native Client

En el controlador ODBC de SQL Server Native Client, se han realizado varios cambios en varias funciones para admitir el tipo de datos xml.

SQLColAttribute

La función SQLColAttribute tiene tres nuevos identificadores de campo, incluidos SQL_CA_SS_XML_SCHEMACOLLECTION_CATALOG_NAME, SQL_CA_SS_XML_SCHEMACOLLECTION_SCHEMA_NAME y SQL_CA_SS _XML_SCHEMACOLLECTION_NAME.

El controlador ODBC de SQL Server Native Client notifica SQL_SS_LENGTH_UNLIMITED para las columnas de SQL_DESC_DISPLAY_SIZE y SQL_DESC_LENGTH.

SQLColumns

La función SQLColumns tiene tres columnas nuevas, como SS_XML_SCHEMACOLLECTION_CATALOG_NAME, SS_XML_SCHEMACOLLECTION_SCHEMA_NAME y SS_XML_SCHEMACOLLECTION_NAME. La columna TYPE_NAME existente se usa para indicar el nombre del tipo XML, y el valor DATA_TYPE de una columna o parámetro de tipo XML es SQL_SS_XML.

El controlador ODBC de SQL Server Native Client notifica SQL_SS_LENGTH_UNLIMITED para los valores de COLUMN_SIZE y CHAR_OCTET_LENGTH.

SQLDescribeCol

El controlador ODBC SQL Server Native Client notifica SQL_SS_LENGTH_UNLIMITED cuando no se puede determinar el tamaño de columna en la función SQLDescribeCol.

SQLGetTypeInfo

El controlador ODBC de SQL Server Native Client notifica SQL_SS_LENGTH_UNLIMITED como máximo COLUMN_SIZE para el tipo de datos xml en la función SQLGetTypeInfo.

SQLProcedureColumns

La función SQLProcedureColumns tiene las mismas adiciones de columna que la función SQLColumns .

El controlador ODBC de SQL Server Native Client informa SQL_SS_LENGTH_UNLIMITED como máximo COLUMN_SIZE para el tipo de datos xml.

Conversiones admitidas

Al convertir tipos de datos de SQL en tipos de datos de C, SQL_C_WCHAR, SQL_C_BINARY y SQL_C_CHAR pueden convertirse en SQL_SS_XML, con las condiciones siguientes:

  • SQL_C_WCHAR: formato UTF-16, sin marca de orden de bytes (BOM), con terminación NULL.

  • SQL_C_BINARY: formato UTF-16, sin terminación NULL. Se agrega una marca BOM a los datos recibidos del servidor. Aunque el servidor devuelva una cadena vacía, se devuelve una marca BOM a la aplicación. Si la longitud de búfer es un número de bytes impar, los datos se truncan correctamente. Si el valor completo se devuelve en fragmentos, éstos pueden concatenarse para reconstituir el valor correcto.

  • SQL_C_CHAR: formato de caracteres multibyte codificados en la página de códigos del cliente con terminación NULL. La conversión del UTF-16 proporcionado por el servidor puede producir daños en los datos, de modo que no se recomienda usar este enlace.

Al convertir tipos de datos de C en tipos de datos de SQL, SQL_C_WCHAR, SQL_C_BINARY y SQL_C_CHAR pueden convertirse en SQL_SS_XML, con las condiciones siguientes:

  • SQL_C_WCHAR: siempre se agrega una marca BOM a los datos enviados al servidor. Si los datos ya comenzaban con una marca BOM, habrá dos marcas BOM al inicio del búfer. El servidor usa la primera marca para reconocer la codificación como UTF-16 y, a continuación, la descarta. La segunda marca se interpreta como un carácter de espacio de no separación de ancho cero.

  • SQL_C_BINARY: no se realiza ninguna conversión y los datos se pasan al servidor "tal como está". Los datos UTF-16 deben comenzar con una lista de materiales; Si no es así, es posible que el servidor no reconozca correctamente la codificación.

  • SQL_C_CHAR: los datos se convierten a UTF-16 en el cliente y se envían al servidor de la misma forma que SQL_C_WCHAR (incluida la adición de una marca BOM). Si el XML no está codificado en la página de códigos del cliente, pueden producirse daños en los datos.

El estándar XML exige que el XML con codificación UTF-16 comience con una marca de orden de bytes (BOM), el código de carácter UTF-16 0xFEFF. Al trabajar con un enlace de SQL_C_BINARY, SQL Server Native Client no requiere ni agrega una lista de materiales, ya que la codificación está implícita en el enlace. Se intenta proporcionar simplicidad a la hora de actuar con otros sistemas de almacenamiento y procesadores XML. En este caso, una lista boM debe estar presente con xml codificado UTF-16 y la aplicación no debe preocuparse por la codificación real, ya que la mayoría de los procesadores XML (incluidos SQL Server) deducen la codificación inspeccionando los primeros bytes del valor. Los datos XML recibidos de SQL Server Native Client mediante enlaces de SQL_C_BINARY siempre se codifican en UTF-16 con una boM y sin una declaración de codificación incrustada.

Consulte también

Características de SQL Server Native Client
ISSCommandWithParameters (OLE DB)