Coerções de tipo de dados (Esquema XDR)
Importante |
---|
Este tópico está incluso como referência para aplicativos herdados. Não será feito nenhum trabalho de desenvolvimento futuro nesse recurso. Evite usá-lo em novos trabalhos de desenvolvimento. Em vez disso, use esquemas XSD anotados para criar exibições XML. Para obter mais informações, consulte Introdução a esquemas XSD anotados (SQLXML 4.0). Você pode converter esquemas XDR anotados existentes em esquemas XSD. Para obter mais informações, consulte Convertendo esquemas XDR anotados a esquemas XSD equivalentes (SQLXML 4.0). |
O tipo de dados de um elemento ou um atributo pode ser especificado em um esquema XDR. Quando um esquema XDR é usado para extrair dados do banco de dados, o formato de dados apropriado é produzido como resultado de uma consulta. As anotações dt:type e sql:datatype anotações são usadas para controlar o mapeamento entre tipos de dados XDR e Microsoft SQL Server.
dt:type
Você pode usar o atributo dt:type para especificar o tipo de dados de XML de um atributo ou elemento que mapeia para uma coluna. O atributo dt:type pode ser especificado em <AttributeType> ou <ElementType>. O dt:type afeta o documento retornado do servidor e também a consulta XPath executada. Quando uma consulta XPath é executada em um esquema de mapeamento que contém dt:type, o XPath usa o tipo de dados indicado ao processar a consulta. Para obter mais informações sobre como XPath usa dt:type, consulte 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 dt:type.
Tipo de dados XML |
Conversão do 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 os demais |
Nenhuma conversão adicional |
Observe que alguns valores do SQL Server não podem ser convertidos a alguns tipos de dados XML, porque a conversão não é possível (por exemplo, “XYZ” para um tipo de dados numérico) ou porque o valor excede a faixa desse tipo de dados (por exemplo, -100000 convertido a ui2). Conversões de tipo incompatíveis podem resultar em documentos XML inválidos ou erros de SQL Server.
Mapeando dos tipos de dados do SQL Server para os tipos de dados XML
A tabela mostra um mapeamento natural de tipos de dados do SQL Server para tipos de dados XML.
Tipo de dados do SQL Server |
Tipo de dados 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
O tipo de dados XML bin.base64 mapeia para vários tipos de dados do Microsoft SQL Server (binary, image, varbinary). Para mapear claramente o tipo de dados XML bin.base64 para um dado específico do SQL Server, a anotação sql:datatype é usada. sql:datatype especifica o tipo de dados do SQL Server da coluna para a qual o atributo mapeia.
Isto é útil quando os dados estão sendo armazenados no banco de dados. Especificando a anotação sql:datatype, você pode identificar o tipo de dados SQL Server explícito. O item de dados é armazenado então como o tipo especificado em sql:datatype.
A anotação sql:datatype dá suporte a todos os tipos de dados embutidos do SQL Server. (Tipos de dados definidos pelo usuário ou sinônimos não têm suporte.) Precisão e escala também possuem suporte, como sql:datatype="nvarchar"and sql:datatype="nchar(10)".
A especificação de tipos de dados XDR e do SQL Server no esquema de mapeamento pode ajudar a eliminar conversões de dados desnecessárias em consultas de SQL. Por exemplo, XPath deve converter do tipo de dados do SQL Server para o tipo de dados XDR e, em seguida, do tipo XDR para XPath. Quando o tipo sql:datatype ou XDR é especificado e XPath determina que a conversão é desnecessária, XPath não faz isto.
No caso de colunas de chave primária, a eliminação dessas conversões pode resultar em uma melhoria de desempenho significativa. Por exemplo, a consulta a seguir normalmente exige uma conversão de CustomerID para cadeia de caracteres (nvarchar) para garantir os resultados corretos:
Customer[@CustomerID='ALFKI']
Se CustomerID for anotado no esquema com sql:datatype="nvarchar", XPath poderá evitar a conversão de dados desnecessária.
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. Especifique dt:type em um atributo
Nesse esquema XDR, dt:type é especificado nos atributos OrdDate e ShipDate.
Para o atributo ReqDate, nenhum tipo de dados de XPath é especificado. Então, XPath retorna os valores datetime do SQL Server recuperados da coluna RequiredDate no banco de dados.
A “data” em que o tipo de dado XPath é especificado no atributo OrdDate. XPath retorna só a parte de data dos valores (e nenhuma hora) recuperada da coluna OrderDate.
O tipo de dado "hora" do XPath é especificado no atributo ShipDate. XPath retorna somente a parte de hora dos valores (e não de data) recuperados da coluna 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 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 dataTypeXdr.xml.
Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como dataTypeXdrT.xml no mesmo diretório em que você salvou 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>
Este URL executa o modelo:
http://IISServer/AdventureWorks/template/dataTypeXdrT.xml
A seguir está o conjunto de resultados:
<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. Especifique sql:datatype em um atributo
Neste exemplo, sql:datatype é usado para identificar o tipo de dados SQL Server da coluna de 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 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 DataTypeXdr2.xml.
Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como DataTypeXdr2T.xml no mesmo diretório em que você salvou 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>
O caminho de diretório especificado para o esquema de mapeamento (DataTypeXdr2.xml) é relativo ao diretório onde o modelo está salvo. Também é possível especificar um caminho absoluto, por exemplo:
mapping-schema="C:\MyDir\DataTypeXdr2.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.
A seguir está o conjunto de resultados:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ProductPhoto PhotoID="100" filename="racer02_red_large.gif"
photo="Binary_base64_image_returned_here"/>
</ROOT>