Especificando relações usando sql:relationship (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). |
Os elementos em um documento XML podem ser relacionados. Eles podem ser aninhados hierarquicamente e as relações ID, IDREF ou IDREFS entre os elementos podem ser especificadas.
Por exemplo, em um esquema XDR, um elemento <Customer> contém os elementos filho <Order>. O elemento <Customer> é mapeado para uma tabela que contém os dados do cliente (como Sales.Customer no banco de dados AdventureWorks). O elemento <Order> é mapeado para uma tabela que contém dados de pedidos no mesmo banco de dados (como Sales.SalesORderHeader). Estas tabelas subjacentes, Sales.Customer e Sales.SalesOrderHeader, estão relacionadas porque os clientes fazem pedidos. O elemento CustomerID na tabela Sales.SalesOrderHeader é uma chave estrangeira que faz referência à chave primária CustomerID na tabela Sales.Customer. Você pode estabelecer estas relações entre elementos do esquema de mapeamento usando a anotação <sql:relationship>.
No esquema XSD anotado, a anotação <sql:relationship> é usada para aninhar os elementos de esquema hierarquicamente, com base nas relações de chave primária e chave estrangeira entre as tabelas subjacentes para as quais os elementos são mapeados. Na especificação da anotação <sql:relationship>, você deve identificar:
A tabela primária (Sales.Customer) e a tabela estrangeira (Sales.SalesOrderHeader) e
A condição de junção necessária (CustomerID em Sales.SalesOrderHeader é uma chave estrangeira que faz referência à chave primária de CustomerID na tabela Sales.Customer).
Estas informações são usadas para gerar a devida hierarquia (para cada elemento <customer>, os elementos relacionados <order> aparecem como elementos filhos).
Para fornecer os nomes de tabela e as informações de junção necessárias, os seguintes atributos são especificados com a anotação <sql:relationship>. Esses atributos são válidos somente com o elemento sql:relationship:
key-relation
Especifica a relação primária (tabela).key
Especifica a chave primária da key-relation. Se a chave primária for composta por várias colunas, os valores serão especificados com um espaço entre eles. Há um mapeamento posicional entre os valores especificados para a chave de várias colunas e a chave estrangeira correspondente.foreign-relation
Especifica a relação estrangeira (tabela).foreign-key
Especifica a chave estrangeira na foreign-relation que faz referência a key em key-relation. Se a chave estrangeira for composta de vários atributos (colunas), os valores de chave estrangeira serão especificados com um espaço entre eles. Há um mapeamento posicional entre os valores especificados para a chave de várias colunas e a chave estrangeira correspondente.
Observação |
---|
Você deve garantir que os tipos de dados do Microsoft SQL Server de key e foreign-key sejam tais que eles possam ser convertidos implicitamente se necessário. |
A marca sql:relationship pode ser adicionada somente a elementos <element> ou <attribute> em um esquema anotado. Quando sql:relationship for especificado em um atributo, deve haver um sql:relation e um sql:field especificados para o atributo para garantir que um valor único é recuperado (vários atributos do mesmo nome são inválidos em XML). Quando sql:relationship é especificado em um elemento, a relação pode resultar em um único valor ou em um conjunto de valores.
A marca sql:relationship é usada para especificar uma única relação lógica entre duas entidades. Os atributos definem as relações e os campos usados para definir a relação lógica. Várias instâncias de sql:relationship podem ser especificadas dentro de um elemento ou atributo no esquema anotado, o que indica uma relação complexa entre o elemento ou atributo e seu elemento contido. Todas as instâncias de sql:relationship são usadas juntas para definir a relação complexa.
Quando várias instâncias da marca sql:relationship são especificadas dentro de um elemento ou atributo, a ordem na qual eles aparecerão é significativa.
A anotação sql:key-fields deve ser especificada em um elemento que contenha um elemento filho e um sql:relationship, definido entre o elemento e o filho, que não fornece a chave primária da tabela especificada no elemento pai. Para obter mais informações, consulte Identificando colunas de chave usando campos sql:key (SQLXML 4.0). Para gerar o aninhamento adequado no resultado, recomenda-se que sql:key-fields seja especificado em todos os esquemas.
Observação |
---|
No esquema de mapeamento, os valores relacionais, como nome de tabela e nome de coluna, fazem diferenciação de maiúsculas e minúsculas. |
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. Especificar sql:relationship em um <element>
Este esquema XDR anotado inclui os elementos <Customer> e <Order>. O elemento <Order> é um elemento filho do elemento <Customer>.
No esquema, a anotação sql:relationship é especificada no elemento filho <Order>. A anotação identifica CustomerID na tabela Sales.SalesOrderHeader como uma chave estrangeira que faz referência à chave primária CustomerID na tabela Sales.Customer. Portanto, os pedidos que pertencem a um cliente aparecem como um elemento filho do elemento desse elemento <Customer>.
<?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="CustomerID" />
<AttributeType name="SalesOrderID" />
<AttributeType name="OrderDate" />
<attribute type="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
</ElementType>
<ElementType name="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
<element type="Order" >
<sql:relationship
key-relation="Sales.Customer"
key="CustomerID"
foreign-key="CustomerID"
foreign-relation="Sales.SalesOrderHeader" />
</element>
</ElementType>
</Schema>
Observação |
---|
No esquema de mapeamento, os valores relacionais, como nome de tabela e nome de coluna, fazem diferenciação de maiúsculas e minúsculas. No exemplo anterior, Customers é o valor do atributo sql:relation. O valor do atributo key-relation correspondente também deve ser Customers. |
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 sql-relationship-xdr.xml.
Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como sql-relationship-xdrT.xml no mesmo diretório em que você salvou sql-relationship-xdr.xml. A consulta no modelo seleciona um cliente com o CustomerID 1.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="sql-relationship-xdr.xml"> Customer[@CustomerID="1"] </sql:xpath-query> </ROOT>
O caminho de diretório especificado para o esquema de mapeamento (sql-relationship-xdr.xml) é relativo ao diretório onde o modelo é salvo. Também é possível especificar um caminho absoluto, por exemplo:
mapping-schema="C:\SqlXmlTest\sql-relationship-xdr.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">
<Customer CustomerID="1">
<Order CustomerID="1" SalesOrderID="43860" OrderDate="2001-08-01T00:00:00" />
<Order CustomerID="1" SalesOrderID="44501" OrderDate="2001-11-01T00:00:00" />
<Order CustomerID="1" SalesOrderID="45283" OrderDate="2002-02-01T00:00:00" />
<Order CustomerID="1" SalesOrderID="46042" OrderDate="2002-05-01T00:00:00" />
</Customer>
</ROOT>
B. Especificar sql:relationship em um <attribute> e criar referências de documento usando ID e IDREFS.
Neste exemplo, são especificadas referências de documento locais usando ID e IDREFS. O esquema XDR de exemplo consiste em um elemento <Customer> que é mapeado para a tabela Sales.Customer. Esse elemento consiste em um elemento filho <Order> que é mapeado para a tabela Sales.SalesOrderHeader.
No exemplo, sql:relationship é especificado duas vezes:
sql:relationship é especificado no elemento filho <Order>. Portanto, os pedidos que pertencem a um cliente aparecerão como um elemento filho do elemento desse elemento <Customer>.
sql:relationship também é especificado no atributo OrderIDList do elemento <Customer>. Esse atributo é definido como um tipo IDREFS que faz referência ao atributo SalesOrderID (um atributo do tipo ID) do elemento <Order>. Portanto, é necessário sql:relationship. Nesse caso, a anotação sql:relationship permite que uma lista de pedidos pertencentes a um cliente seja exibida com esse elemento <Customer>.
Atributos especificados como IDREFS podem ser usados para fazer referência a atributos do tipo ID, permitindo assim vínculos entre documentos.
Como os números não são valores de ID válidos (devem ser tokens de nome), sql:id-prefix foi usado para tornar Order ID um valor de cadeia de caracteres. Para obter mais informações, consulte Criando atributos do tipo Valid ID, IDREF e IDREFS usando sql:id-prefix (Esquema XDR).
<?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" dt:type="id" sql:id-prefix="Ord-" />
<AttributeType name="OrderDate" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
</ElementType>
<ElementType name="Customer" sql:relation="Sales.Customer">
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
<AttributeType name="OrderIDList" dt:type="idrefs"
sql:id-prefix="Ord-"/>
<attribute type="OrderIDList" sql:relation="Sales.SalesOrderHeader"
sql:field="SalesOrderID">
<sql:relationship
key-relation="Sales.Customer"
key="CustomerID"
foreign-relation="Sales.SalesOrderHeader"
foreign-key="CustomerID" />
</attribute>
<element type="Order">
<sql:relationship key-relation="Sales.Customer"
key="CustomerID"
foreign-relation="Sales.SalesOrderHeader"
foreign-key="CustomerID" />
</element>
</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 idIdref-xdr.xml.
Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como idIdref-xdrT.xml no mesmo diretório onde você salvou idIdref-xdr.xml. A consulta no modelo seleciona um cliente com o CustomerID 1.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="idIdref-xdr.xml"> Customer[@CustomerID="1"] </sql:xpath-query> </ROOT>
O caminho de diretório especificado para o esquema de mapeamento (idIdref-xdr.xml) é relativo ao diretório onde o modelo está salvo. Também é possível especificar um caminho absoluto, por exemplo:
mapping-schema="C:\SqlXmlTest\idIdref-xdr.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">
<Customer CustomerID="1"
OrderIDList="Ord-43860 Ord-44501 Ord-45283 Ord-46042">
<Order SalesOrderID="Ord-43860" OrderDate="2001-08-01T00:00:00" />
<Order SalesOrderID="Ord-44501" OrderDate="2001-11-01T00:00:00" />
<Order SalesOrderID="Ord-45283" OrderDate="2002-02-01T00:00:00" />
<Order SalesOrderID="Ord-46042" OrderDate="2002-05-01T00:00:00" />
</Customer>
</ROOT>
C. Especificar sql:relationship em vários elementos
Neste exemplo, o esquema XDR anotado consiste nos elementos <Customer>, <Order> e <OD>.
O elemento <Order> é um elemento filho do elemento <Customer>. sql:relationship é especificada no elemento filho <Order>; portanto, os pedidos pertencentes a um cliente são exibidos como elementos filho de <Customer>.
O elemento <Order> inclui o elemento filho <OD>. sql:relationship é especificada no elemento filho <OD>, de forma que os detalhes do pedido pertencente a um pedido apareçam como elementos filho desse elemento <Order>.
<?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="OD" sql:relation="Sales.SalesOrderDetail" >
<AttributeType name="SalesOrderID" />
<AttributeType name="ProductID" />
<attribute type="SalesOrderID" />
<attribute type="ProductID" />
</ElementType>
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >
<AttributeType name="CustomerID" />
<AttributeType name="SalesOrderID" />
<AttributeType name="OrderDate" />
<attribute type="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
<element type="OD" >
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="SalesOrderID"
foreign-key="SalesOrderID"
foreign-relation="Sales.SalesOrderDetail" />
</element>
</ElementType>
<ElementType name="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
<element type="Order" >
<sql:relationship
key-relation="Sales.Customer"
key="CustomerID"
foreign-key="CustomerID"
foreign-relation="Sales.SalesOrderHeader" />
</element>
</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 sql-relationship-multi-xdr.xml.
Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como sql-relationship-multi-xdrT.xml no mesmo diretório em que você salvou sql-relationship-multi-xdr.xml. A consulta no modelo retorna informações de pedido por um cliente cujo CustomerID é 1 e SalesOrderID é 43860.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="sql-relationship-multi-xdr.xml"> /Customer[@CustomerID="1"]/Order[@SalesOrderID=43860] </sql:xpath-query> </ROOT>
O caminho de diretório especificado para o esquema de mapeamento (sql-relationship-multi-xdr.xml) é relativo ao diretório onde o modelo é salvo. Também é possível especificar um caminho absoluto, por exemplo:
mapping-schema="C:\SqlXmlTest\sql-relationship-multi-xdr.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 de resultados:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order CustomerID="1" SalesOrderID="43860" OrderDate="2001-08-01T00:00:00">
<OD SalesOrderID="43860" ProductID="761" />
<OD SalesOrderID="43860" ProductID="770" />
<OD SalesOrderID="43860" ProductID="758" />
<OD SalesOrderID="43860" ProductID="765" />
<OD SalesOrderID="43860" ProductID="732" />
<OD SalesOrderID="43860" ProductID="762" />
<OD SalesOrderID="43860" ProductID="738" />
<OD SalesOrderID="43860" ProductID="768" />
<OD SalesOrderID="43860" ProductID="753" />
<OD SalesOrderID="43860" ProductID="729" />
<OD SalesOrderID="43860" ProductID="763" />
<OD SalesOrderID="43860" ProductID="756" />
</Order>
</ROOT>
D. Especificar relações indiretas
Neste exemplo, o esquema XDR anotado consiste nos elementos <Customer> e <OD>. A relação entre esses elementos é indireta (a tabela Sales.Customer é relacionada à tabela Sales.SalesOrderDetail pela tabela Sales.SalesOrderHeader). Para relacionar um cliente aos detalhes do pedido, primeiro é especificada a relação entre as tabelas Sales.Customer e Sales.SalesOrderHeader. Então, a relação entre as tabelas Sales.SalesOrderHeader e Sales.SalesOrderDetail é especificada.
Este é o esquema:
<?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="OD" sql:relation="Sales.SalesOrderDetail" >
<AttributeType name="SalesOrderID" />
<AttributeType name="ProductID" />
<AttributeType name="UnitPrice" />
<attribute type="SalesOrderID" />
<attribute type="ProductID" />
<attribute type="UnitPrice" />
</ElementType>
<ElementType name="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
<element type="OD" >
<sql:relationship
key-relation="Sales.Customer"
key="CustomerID"
foreign-relation="Sales.SalesOrderHeader"
foreign-key="CustomerID"/>
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="SalesOrderID"
foreign-relation="Sales.SalesOrderDetail"
foreign-key="SalesOrderID" />
</element>
</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 indirect-relationship-xdr.xml.
Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como indirect-relationship-xdrT.xml no mesmo diretório em que você salvou indirect-relationship-xdr.xml. A consulta no modelo retorna informações do pedido para um cliente CustomerID é 1.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <sql:xpath-query mapping-schema="indirect-relationship-xdr.xml" > /Customer[@CustomerID="1"] </sql:xpath-query> </ROOT>
O caminho de diretório especificado para o esquema de mapeamento (indirect-relationship-xdr.xml) é relativo ao diretório onde o modelo é salvo. Também é possível especificar um caminho absoluto, por exemplo:
mapping-schema="C:\SqlXmlTest\indirect-relationship-xdr.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 resultado parcial:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Customer CustomerID="1">
<OD SalesOrderID="43860" ProductID="761" UnitPrice="503.3507" />
<OD SalesOrderID="43860" ProductID="770" UnitPrice="503.3507" />
<OD SalesOrderID="43860" ProductID="758" UnitPrice="1049.7528" />
<OD SalesOrderID="43860" ProductID="765" UnitPrice="503.3507" />
...
</Customer>
</ROOT>
E. Especificar relacionamentos de junção com várias chaves
Ao especificar uma junção usando sql:relationship, você pode especificar uma junção que envolve duas ou mais colunas. Nesse caso, os nomes de coluna para key e foreign-key são listados usando um espaço.
Este exemplo assume que estas duas tabelas existem em um banco de dados temporário (como tempdb):
dbo.Cust (fname, lname)
dbo.Ord (OrderID, fname, lname)
As colunas fname e lname formam a chave primária da tabela Cust. OrderID é a chave primária da tabela Ord. fname e lname na tabela Ord são chaves estrangeiras que fazem referência à chave primária fname e lname da tabela Cust.
Este esquema consiste nos elementos <Cust> e <Ord>. sql:relationship é usado para fazer a junção deles.
<?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="Ord" sql:relation="Ord" >
<AttributeType name="OrderID" />
<attribute type="OrderID" />
</ElementType>
<ElementType name="Cust" sql:relation="Cust" >
<AttributeType name="fname" />
<AttributeType name="lname" />
<attribute type="fname" />
<attribute type="lname" />
<element type="Ord" >
<sql:relationship
key-relation="Cust"
key="fname lname"
foreign-relation="Ord"
foreign-key="fname lname"/>
</element>
</ElementType>
</Schema>
Para testar uma consulta XPath de exemplo com relação ao esquema
Crie as duas tabelas: Cust e Ord.
USE tempdb CREATE TABLE dbo.Cust( fname varchar(20), lname varchar(20) ) CREATE TABLE dbo.Ord ( OrderID int primary key, fname varchar(20), lname varchar(20) ) GO
Adicione estes dados de exemplo:
INSERT INTO Cust values ('Nancy', 'Davolio') INSERT INTO Cust values('Andrew', 'Fuller') INSERT INTO Ord values (1,'Nancy', 'Davolio') INSERT INTO Ord values (2,'Nancy', 'Davolio') INSERT INTO Ord values (3,'Andrew', 'Fuller')
Copie o código de esquema acima e cole-o em um arquivo de texto. Salve o arquivo como multikey-join-xdr.xml.
Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como multikey-join-xdrT.xml no mesmo diretório onde você salvou multikey-join-xdr.xml. A consulta no modelo retorna as informações do cliente.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <sql:xpath-query mapping-schema="multikey-join-xdr.xml" > /Cust </sql:xpath-query> </ROOT>
O caminho de diretório especificado para o esquema de mapeamento (multikey-join-xdr.xml) é relativo ao diretório onde o modelo está salvo. Também é possível especificar um caminho absoluto, por exemplo:
mapping-schema="C:\SqlXmlTest\multikey-join-xdr.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 resultado parcial:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Cust fname="Andrew" lname="Fuller">
<Ord OrderID="3" />
</Cust>
<Cust fname="Nancy" lname="Davolio">
<Ord OrderID="1" />
<Ord OrderID="2" />
</Cust>
</ROOT>