Partilhar via


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

Aplica-se a: SQL Server Banco de Dados SQL do Azure

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ê também pode especificar 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 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 em um esquema de mapeamento que contém xsd:type, o XPath usa o tipo de dados especificado quando processa a consulta. Para obter mais informações sobre como o 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 usadas para vários valores xsd:type .

Tipo de dados XSD Conversão do SQL Server
Booliano CONVERT(bit, COLUMN)
Data 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)
Hora SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24)
Todos os outros Nenhuma conversão adicional

Observação

Alguns dos valores retornados pelo SQL Server podem não ser compatíveis com os tipos de dados XML 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 XSD UnsignedShort ). 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 tabela a seguir mostra um mapeamento óbvio de tipos de dados do SQL Server para tipos de dados XSD. Se você souber o tipo de 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 longo
binary base64Binário
bit booleano
char cadeia de caracteres
datetime dateTime
decimal decimal
float double
imagem base64Binário
int int
money decimal
nchar cadeia de caracteres
ntext cadeia de caracteres
nvarchar cadeia de caracteres
numeric decimal
real float
smalldatetime dateTime
smallint short
smallmoney decimal
sql_variant cadeia de caracteres
sysname cadeia de caracteres
text cadeia de caracteres
timestamp dateTime
tinyint unsignedByte
varbinary base64Binário
varchar cadeia de caracteres
uniqueidentifier cadeia de caracteres

Anotação sql:datatype

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

  • Você está carregando em massa em uma coluna dateTimedo SQL Server a partir de um tipo XSD dateTime, date ou time . Nesse 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ê está carregando em massa em uma coluna do tipo identificador exclusivo do SQL Server e o valor XSD é um GUID que inclui chaves ({ e }). Quando você especifica sql:datatype="uniqueidentifier", as chaves são removidas do valor antes de serem inseridas 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 (binário, imagem ou varbinário). 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 explícito do SQL Server.

Geralmente, é recomendável especificar 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 de SQLXML.

R. Especificando xsd:type

Este exemplo mostra como um tipo de data XSD especificado usando o atributo xsd:type no esquema afeta o documento 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>  

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

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

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

  • Não especifica xsd:type no atributo DueDate , o mesmo valor 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 Usar o ADO para executar consultas SQLXML 4.0.

Este é o conjunto de resultados parcial:

<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 trabalho, consulte Exemplo G em exemplos de carregamento em massa de XML (SQLXML 4.0). Nesse exemplo, um valor de GUID que inclui "{" e "}" é carregado em massa. O esquema neste exemplo especifica sql:datatype para identificar o tipo de dados do SQL Server como uniqueidentifier. Este exemplo ilustra quando sql:datatype deve ser especificado no esquema.