Conversión de tipos de datos (esquema XDR)
Importante |
---|
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
Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como dataTypeXdr.xml.
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>
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
Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como DataTypeXdr2.xml.
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"
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>