Compartir a través de


Conversión de tipos de datos (esquema XDR)

Nota importanteImportante

Este tema se incluye como referencia para las aplicaciones heredadas. No se llevará a cabo ningún trabajo de desarrollo de esta característica en el futuro. Evite usarla en nuevos trabajos de desarrollo. En su lugar, use esquemas XSD anotados para crear vistas XML. Para obtener más información, vea Introducción a los esquemas XSD anotados (SQLXML 4.0). Puede convertir los esquemas XDR anotados existentes en esquemas XSD. Para obtener más información, vea Convertir esquemas XDR anotados en esquemas XSD equivalentes (SQLXML 4.0).

El tipo de datos de un elemento o de un atributo se puede especificar en un esquema XDR. Cuando se utiliza un esquema XDR para extraer datos de la base de datos, se envía el formato de datos correspondiente como resultado de una consulta. Las anotaciones sql:datatype y dt:type se utilizan para controlar la asignación entre los tipos de datos de XDR y los tipos de datos de Microsoft SQL Server.

dt:type

Puede utilizar el atributo dt:type para especificar el tipo de datos XML de un atributo o elemento que se asigna a una columna. El atributo dt:type se puede especificar en <AttributeType> o <ElementType>. dt:type afecta al documento devuelto por el servidor y a la consulta XPath ejecutada. Cuando se ejecuta una consulta XPath en un esquema de asignación que contiene dt:type, XPath utiliza el tipo de datos indicado al procesar la consulta. Para obtener más información sobre cómo XPath utiliza dt:type, vea Tipos de datos de XPath (SQLXML 4.0).

En un documento devuelto, todos los tipos de datos de SQL Server se convierten en representaciones de cadena. Algunos tipos de datos requieren conversiones adicionales. En la tabla siguiente se indican las conversiones que se utilizan para distintos valores de dt:type.

Tipo de datos XML

Conversión de SQL Server

bit

CONVERT (bit, COLUMN)

date

LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10)

fixed.14.4

CONVERT(money, COLUMN)

id./idref/idrefs

id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)

nmtoken/nmtokens

id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)

time/time.tz

SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24)

Todos los demás

Ninguna conversión adicional

Observe que algunos valores de SQL Server no se pueden convertir en tipos de datos XML bien porque la conversión no es posible (por ejemplo, la conversión de "XYZ" en un tipo de datos numérico), bien porque el valor supera el intervalo de ese tipo de datos (por ejemplo, la conversión de -100000 en ui2). Las conversiones de tipos incompatibles pueden producir documentos XML no válidos o errores de SQL Server.

Asignar tipos de datos de SQL Server a tipos de datos XML

En la tabla se muestra una asignación natural de los tipos de datos de SQL Server a los tipos de datos XML.

Tipo de datos de SQL Server

Tipo de datos XML

bigint

i8

binary

bin.base64

bit

boolean

char

char

datetime

datetime

decimal

r8

float

r8

image

bin.base64

int

int

money

r8

nchar

string

ntext

string

nvarchar

string

numeric

r8

real

r4

smalldatetime

datetime

smallint

i2

smallmoney

fixed.14.4

sysname

string

text

string

timestamp

ui8

tinyint

ui1

varbinary

bin.base64

varchar

string

uniqueidentifier

uuid

sql:datatype

El tipo de datos XML bin.base64 se asigna a varios tipos de datos de Microsoft SQL Server (binary, image, varbinary). Para asignar claramente el tipo de datos XML bin.base64 a datos de SQL Server específicos, se utiliza la anotación sql:datatype. sql:datatype especifica el tipo de datos de SQL Server de la columna a la que se asigna el atributo.

Esto resulta útil cuando los datos se van a almacenar en la base de datos. Puede identificar el tipo de datos de SQL Server explícito mediante la anotación sql:datatype. El elemento de datos se almacenará entonces como el tipo especificado en sql:datatype.

La anotación sql:datatype admite todos los tipos de datos integrados de SQL Server. (No se admiten los tipos de datos definidos por el usuario ni los sinónimos). También se admiten la precisión y escala, como sql:datatype="nvarchar"and sql:datatype="nchar(10)".

La especificación de tipos de datos de XDR y de SQL Server en el esquema de asignación puede ayudar a eliminar conversiones de datos innecesarias en consultas SQL. Por ejemplo, XPath debe convertir el tipo de datos de SQL Server en el tipo de datos de XDR y a continuación, el tipo de XDR en el tipo de XPath. Cuando se especifica sql:datatype o el tipo de XDR y XPath determina que la conversión es innecesaria, XPath no realiza la conversión.

En el caso de las columnas de clave principal, la eliminación de estas conversiones puede producir una mejora del rendimiento importante. Por ejemplo, la consulta siguiente requiere normalmente la conversión de CustomerID en una cadena (nvarchar) para garantizar que los resultados son correctos:

Customer[@CustomerID='ALFKI']

Si CustomerID se anota en el esquema con sql:datatype="nvarchar", XPath puede evitar la conversión de datos innecesaria.

Ejemplos

Para crear muestras funcionales mediante los ejemplos siguientes, debe cumplir determinados requisitos. Para obtener más información, vea Requisitos para ejecutar los ejemplos de SQLXML.

A. Especificar dt:type en un atributo

En este esquema XDR, dt:type se especifica en los atributos OrdDate y ShipDate.

Para el atributo ReqDate, no se especifica ningún tipo de datos de XPath. Por tanto, XPath devuelve los valores datetime de SQL Server recuperados de la columna RequiredDate de la base de datos.

El tipo de datos "date" de XPath se especifica en el atributo OrdDate. XPath sólo devuelve la parte de la fecha (sin la hora) de los valores recuperados de la columna OrderDate.

El tipo de datos "time" de XPath se especifica en el atributo ShipDate. XPath sólo devuelve la parte de la hora (sin la fecha) de los valores recuperados de la columna ShippedDate.

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<ElementType name="Order" sql:relation="Orders">
    <AttributeType name="OID" />
    <AttributeType name="CustID"  />
    <AttributeType name="OrdDate" dt:type="date" />
    <AttributeType name="ReqDate" />
    <AttributeType name="ShipDate" dt:type="time" />

    <attribute type="OID" sql:field="OrderID" />
    <attribute type="CustID" sql:field="CustomerID" />
    <attribute type="OrdDate" sql:field="OrderDate" />
    <attribute type="ReqDate" sql:field="RequiredDate" />
    <attribute type="ShipDate" sql:field="ShippedDate" />
</ElementType>
</Schema>

Para probar una consulta XPath de ejemplo en el esquema

  1. Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como dataTypeXdr.xml.

  2. Copie la plantilla siguiente y péguela en un archivo de texto. Guarde el archivo como dataTypeXdrT.xml en el mismo directorio donde guardó dataTypeXdr.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="dataTypeXdr.xml">
        /Order[@OID=43860]
      </sql:xpath-query>
    </ROOT>
    
  3. Esta dirección URL ejecuta la plantilla:

    http://IISServer/AdventureWorks/template/dataTypeXdrT.xml
    

El conjunto de resultados es:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Order OID="43860" CustID="1" OrdDate="2001-08-01" ReqDate="2001-08-13T00:00:00" ShipDate="00:00:00" /> 
</ROOT>

B. Especificar sql:datatype en un atributo

En este ejemplo, sql:datatype se utiliza para identificar el tipo de datos de SQL Server de la columna LargePhoto.

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<ElementType name="ProductPhoto" sql:relation="Production.ProductPhoto">
    <AttributeType name="PhotoID" />
    <AttributeType name="filename" />
    <AttributeType name="photo" sql:datatype="image"  />

    <attribute type="PhotoID" sql:field="ProductPhotoID" />
    <attribute type="filename" sql:field="LargePhotoFileName" />
    <attribute type="photo" sql:field="LargePhoto" />
</ElementType>
</Schema>

Para probar una consulta XPath de ejemplo en el esquema

  1. Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como DataTypeXdr2.xml.

  2. Copie la plantilla siguiente y péguela en un archivo de texto. Guarde el archivo como DataTypeXdr2T.xml en el mismo directorio donde guardó DataTypeXdr2.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="DataTypeXdr2.xml">
        /ProductPhoto[@PhotoID="100"]
      </sql:xpath-query>
    </ROOT>
    

    La ruta de acceso al directorio especificada para el esquema de asignación (DataTypeXdr2.xml) es una ubicación relativa con respecto al directorio donde se guarda la plantilla. También puede especificarse una ruta de acceso absoluta como, por ejemplo:

    mapping-schema="C:\MyDir\DataTypeXdr2.xml"
    
  3. Cree y use el script de prueba de SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar la plantilla.

    Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

El conjunto de resultados es:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
    <ProductPhoto PhotoID="100" filename="racer02_red_large.gif" 
 photo="Binary_base64_image_returned_here"/> 
</ROOT>

Vea también

Referencia