Compartir vía


Conversiones de tipo de datos y anotación sql:datatype (SQLXML 4.0)

Se aplica a: SQL Server Azure SQL Database

En un esquema XSD, el atributo xsd:type especifica el tipo de datos XSD de un elemento o atributo. Cuando se usa un esquema XSD para extraer datos de la base de datos, el tipo de datos especificado se usa para dar formato a los datos.

Además de especificar un tipo XSD en un esquema, también puede especificar un tipo de datos de Microsoft SQL Server mediante la anotación sql:datatype . Los atributos xsd:type y sql:datatype controlan la asignación entre tipos de datos XSD y tipos de datos de SQL Server.

Atributo xsd:type

Puede usar el atributo xsd:type para especificar el tipo de datos XML de un atributo o elemento que se asigna a una columna. El tipo xsd: afecta al documento que se devuelve del servidor y también a la consulta XPath que se ejecuta. Cuando se ejecuta una consulta XPath en un esquema de asignación que contiene xsd:type, XPath usa el tipo de datos especificado cuando procesa la consulta. Para obtener más información sobre cómo XPath usa xsd:type, vea Asignación de tipos de datos XSD a tipos de datos 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 enumeran las conversiones que se usan para varios valores xsd:type .

Tipo de datos XSD Conversión de SQL Server
Booleano CONVERT(bit, COLUMN)
Date LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10)
decimal CONVERT(money, COLUMN)
id/idref/idrefs id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)
nmtoken/nmtokens id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)
Time SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24)
Todos los demás Ninguna conversión adicional

Nota:

Es posible que algunos de los valores devueltos por SQL Server no sean compatibles con los tipos de datos XML especificados mediante xsd:type, ya sea porque la conversión no es posible (por ejemplo, convertir "XYZ" en un tipo de datos decimal) o porque el valor supera el intervalo de ese tipo de datos (por ejemplo, -100000 convertido a un tipo XSD de UnsignedShort). Las conversiones de tipos incompatibles pueden dar lugar a documentos XML que no son válidos o en errores de SQL Server.

Asignar tipos de datos SQL Server a tipos de datos XSD

En la tabla siguiente se muestra una asignación obvia de tipos de datos de SQL Server a tipos de datos XSD. Si conoce el tipo de SQL Server, esta tabla proporciona el tipo XSD correspondiente que puede especificar en el esquema XSD.

Tipos de datos de SQL Server Tipo de datos XSD
bigint long
binary base64Binary
bit boolean
char string
datetime dateTime
decimal decimal
float double
image base64Binary
int int
money decimal
nchar string
ntext string
nvarchar string
numeric decimal
real float
smalldatetime dateTime
smallint short
smallmoney decimal
sql_variant string
sysname string
text string
timestamp dateTime
tinyint unsignedByte
varbinary base64Binary
varchar string
uniqueidentifier string

Anotación sql:datatype

La anotación sql:datatype se usa para especificar el tipo de datos de SQL Server; esta anotación debe especificarse cuando:

  • Carga masiva en una columna de SQL Server dateTimedesde un tipo dateTime, dateTime o time de XSD. En este caso, debe identificar el tipo de datos de columna de SQL Server mediante sql:datatype="dateTime". Esta regla también se aplica a los diagramas de actualización.

  • Carga masiva en una columna de tipo uniqueidentifier de SQL Server y el valor XSD es un GUID que incluye llaves ({ y }). Al especificar sql:datatype="uniqueidentifier", las llaves se quitan del valor antes de insertarlas en la columna. Si no se especifica sql:datatype , el valor se envía con las llaves y se produce un error en la inserción o actualización.

  • El tipo de datos XML base64Binary se asigna a varios tipos de datos de SQL Server (binario, imagen o varbinary). Para asignar el tipo de datos XML base64Binary a un tipo de datos específico de SQL Server, use la anotación sql:datatype . Esta anotación especifica el tipo de datos explícito de SQL Server de la columna a la que se asigna el atributo. Esto resulta de gran utilidad cuando los datos se almacenan en las bases de datos. Al especificar la anotación sql:datatype , puede identificar el tipo de datos explícito de SQL Server.

Por lo general, se recomienda especificar sql:datatype en el esquema.

Ejemplos

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

A Especificar xsd:type

En este ejemplo se muestra cómo un tipo de fecha XSD especificado mediante el atributo xsd:type del esquema afecta al documento XML resultante. El esquema proporciona una vista XML de la tabla Sales.SalesOrderHeader de la base de datos AdventureWorks.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
  <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader">  
     <xsd:complexType>  
       <xsd:attribute name="SalesOrderID" type="xsd:string" />   
       <xsd:attribute name="CustomerID"   type="xsd:string" />   
       <xsd:attribute name="OrderDate"    type="xsd:date" />   
       <xsd:attribute name="DueDate"  />   
       <xsd:attribute name="ShipDate"  type="xsd:time" />   
     </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  

En este esquema XSD, hay tres atributos que devuelven un valor de fecha de SQL Server. Cuando el esquema:

  • Especifica xsd:type=date en el atributo OrderDate , se muestra la parte de fecha del valor devuelto por SQL Server para el atributo OrderDate .

  • Especifica xsd:type=time en el atributo ShipDate , se muestra la parte de tiempo del valor devuelto por SQL Server para el atributo ShipDate .

  • No especifica xsd:type en el atributo DueDate , se muestra el mismo valor devuelto por SQL Server.

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 xsdType.xml.

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

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
      <sql:xpath-query mapping-schema="xsdType.xml">  
        /Order  
      </sql:xpath-query>  
    </ROOT>  
    

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

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

    Para obtener más información, consulte Uso de ADO para ejecutar consultas SQLXML 4.0.

Éste es el conjunto de resultados parciales:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Order SalesOrderID="43659"   
         CustomerID="676"   
         OrderDate="2001-07-01"   
         DueDate="2001-07-13T00:00:00"   
         ShipDate="00:00:00" />   
  <Order SalesOrderID="43660"   
         CustomerID="117"   
         OrderDate="2001-07-01"   
         DueDate="2001-07-13T00:00:00"   
         ShipDate="00:00:00" />   
 ...  
</ROOT>  

Éste es el esquema XDR equivalente:

<?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="Sales.SalesOrderHeader">  
    <AttributeType name="SalesOrderID" />  
    <AttributeType name="CustomerID"  />  
    <AttributeType name="OrderDate" dt:type="date" />  
    <AttributeType name="DueDate" />  
    <AttributeType name="ShipDate" dt:type="time" />  
  
    <attribute type="SalesOrderID" sql:field="OrderID" />  
    <attribute type="CustomerID" sql:field="CustomerID" />  
    <attribute type="OrderDate" sql:field="OrderDate" />  
    <attribute type="DueDate" sql:field="DueDate" />  
    <attribute type="ShipDate" sql:field="ShipDate" />  
</ElementType>  
</Schema>  

B. Especificar el tipo de datos SQL usando sql:datatype

Para obtener un ejemplo de trabajo, vea Ejemplo G en ejemplos de carga masiva XML (SQLXML 4.0). En este ejemplo, se carga de forma masiva un valor GUID que incluye "{" y "}". El esquema de este ejemplo especifica sql:datatype para identificar el tipo de datos de SQL Server como uniqueidentifier. En este ejemplo se muestra cuándo se debe especificar sql:datatype en el esquema.