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çã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
Copie o código de esquema acima e cole-o em um arquivo de texto. Salve o arquivo como xsdType.xml.
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"
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.