Coerções de tipo de dados e a anotação de sql:datatype (SQLXML 4.0)

Em um esquema XSD, o atributo xsd:type especifica o tipo de dados XSD de um elemento ou atributo. Quando um esquema XSD é usado para extrair dados do banco de dados, o tipo de dados especificado é usado para formatar os dados.

Além de especificar um tipo XSD em um esquema, você pode especificar também um tipo de dados do Microsoft SQL Server usando a anotação sql:datatype. Os atributos xsd:type e sql:datatype controlam o mapeamento entre os tipos de dados XSD e os tipos de dados do SQL Server.

Atributo xsd:type

Você pode usar o atributo xsd:type para especificar o tipo de dados de XML de um atributo ou elemento que mapeia para uma coluna. O xsd:type afeta o documento que é retornado do servidor e também a consulta XPath que é executada. Quando uma consulta XPath é executada sobre um esquema de mapeamento que contenha xsd:type, XPath usa o tipo de dados especificado ao processar a consulta. Para obter mais informações sobre como XPath usa xsd:type, consulte Mapeando tipos de dados XSD para tipos de dados XPath (SQLXML 4.0).

Em um documento retornado, todos os tipos de dados do SQL Server são convertidos em representações de cadeia de caracteres. Alguns tipos de dados exigem conversões adicionais. A tabela a seguir lista as conversões que são usadas para obter vários valores xsd:type.

Tipo de dados XSD

Conversão do SQL Server

Boolean

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 os demais

Nenhuma conversão adicional

ObservaçãoObservação

Alguns dos valores retornados pelo SQL Server podem não ser compatíveis com os tipos de dados XML que são especificados usando xsd:type, seja porque a conversão não é possível (por exemplo, converter "XYZ" em um tipo de dados decimal) ou porque o valor excede o intervalo desse tipo de dados (por exemplo, -100000 convertido em um tipo UnsignedShort XSD). Conversões de tipo incompatíveis podem resultar em documentos XML que não são válidos ou em erros do SQL Server.

Mapeando dos tipos de dados do SQL Server para os tipos de dados XSD

A seguinte tabela mostra um mapeamento óbvio de tipos de dados do SQL Server para tipos de dados XSD. Se você souber o tipo do SQL Server, esta tabela fornecerá o tipo XSD correspondente que você pode especificar no esquema XSD.

Tipo de dados do SQL Server

Tipo de dados 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

Anotação sql:datatype

A anotação sql:datatype é usada para especificar o tipo de dados do SQL Server; essa anotação deve ser especificada quando:

  • Você estiver fazendo um carregamento em massa em uma coluna dateTimeSQL Server de um tipo XSD dateTime, date ou time. Neste caso, você deve identificar o tipo de dados de coluna do SQL Server usando sql:datatype="dateTime". Esta regra também se aplica a diagramas de atualização.

  • Você estiver fazendo um carregamento em massa em uma coluna do tipo SQL Serveruniqueidentifier e o valor XSD é um GUID que inclui chaves ({ e }). Quando você especificar sql:datatype="uniqueidentifier", as chaves são removidas do valor antes que ele seja inserido na coluna. Se sql:datatype não for especificado, o valor será enviado com as chaves e a inserção ou atualização falhará.

  • O tipo de dados XML base64Binary é mapeado para vários tipos de dados do SQL Server (binary, image ou varbinary). Para mapear o tipo de dados XML base64Binary para um tipo de dados específico do SQL Server, use a anotação sql:datatype. Essa anotação especifica o tipo de dados explícito do SQL Server da coluna para a qual o atributo é mapeado. Isto é útil quando os dados estão sendo armazenados nos bancos de dados. Especificando a anotação sql:datatype, você pode identificar o tipo de dados SQL Server explícito.

Geralmente é recomendável que você especifique sql:datatype no esquema.

Exemplos

Para criar exemplos de funcionamento usando os exemplos a seguir, é necessário atender a determinados requisitos. Para obter mais informações, consulte Requisitos para executar exemplos do SQLXML.

A. Especificando xsd:type

Este exemplo mostra como um tipo XSD date que é especificado usando o atributo xsd:type no esquema afeta o documento de XML resultante. O esquema fornece uma exibição XML da tabela Sales.SalesOrderHeader no banco de dados 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>

Nesse esquema de XSD, há três atributos que retornam um valor de data de SQL Server. Quando o esquema:

  • Especifica xsd:type=date no atributo OrderDate, a parte de data do valor retornada pelo SQL Server para o atributo OrderDate é exibida.

  • Especifica xsd:type=time no atributo ShipDate, a parte de hora do valor que é retornado pelo SQL Server para o atributo ShipDate é exibida.

  • Não especifica xsd:type no atributo DueDate, o mesmo valor que é retornado pelo SQL Server é exibido.

Para testar uma consulta XPath de exemplo com relação ao esquema

  1. Copie o código de esquema acima e cole-o em um arquivo de texto. Salve o arquivo como xsdType.xml.

  2. Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como xsdTypeT.xml no mesmo diretório onde você salvou xsdType.xml.

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

    O caminho de diretório especificado para o esquema de mapeamento (xsdType.xml) é relativo ao diretório onde o modelo está salvo. Também é possível especificar um caminho absoluto, por exemplo:

    mapping-schema="C:\SqlXmlTest\xsdType.xml"
    
  3. Crie e use o Script de Teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o modelo.

    Para obter mais informações, consulte Usando o ADO para executar consultas do SQLXML 4.0.

Este é o conjunto parcial dos resultados:

<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>

Este é o 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. Especificando o tipo de dados de SQL usando sql:datatype

Para obter um exemplo de funcionamento, consulte o Exemplo G em Exemplos do XML Bulk Load (SQLXML 4.0). Nesse exemplo, um valor de GUID que inclui "{" e "}" é carregado em massa. O esquema nesse exemplo especifica sql:datatype para identificar o tipo de dados do SQL Server como uniqueidentifier. Esse exemplo ilustra quando deve ser especificado sql:datatype no esquema.