Partilhar via


Identificação de Colunas de Chave Usando sql:key-fields (SQLXML 4.0)

Aplica-se a:SQL ServerBanco de Dados SQL do Azure

Quando uma consulta XPath é especificada contra um esquema XSD, a informação da chave é necessária na maioria dos casos para obter o aninhamento adequado no resultado. Especificar a anotação sql:key-fields é uma forma de garantir que a hierarquia apropriada é gerada.

Observação

Para garantir um aninhamento adequado, recomenda-se que especifique campos sql:key para elementos que correspondem a tabelas. O XML produzido é sensível à ordenação do conjunto de resultados subjacente. Se os campos sql:key não forem especificados, o XML gerado pode não ser formado corretamente.

O valor de sql:key-fields identifica a(s) coluna(s) que identificam de forma única as linhas na relação. Se for necessária mais do que uma coluna para identificar unicamente uma linha, os valores das colunas são delimitados por espaços.

Deve usar a anotação sql:key-fields quando um elemento contém uma <relação> sql:definida entre o elemento e um elemento filho, mas que não fornece a chave primária da tabela especificada no elemento pai.

Examples

Para criar exemplos funcionais usando os seguintes exemplos, deve cumprir certos requisitos. Para mais informações, consulte Requisitos para Executar Exemplos de SQLXML.

A. Produzir o aninhamento apropriado quando <sql:relation> não fornece informação suficiente

Este exemplo mostra onde os campos sql:key devem ser especificados.

Considere o seguinte esquema. O esquema especifica uma hierarquia entre os <elementos da Ordem> e <do Cliente> , na qual o <elemento da Ordem> é o pai e o <elemento Cliente> é um filho.

A <etiqueta sql:relationship> é usada para especificar a relação pai-filho. Identifica o CustomerID na tabela Sales.SalesOrderHeader como a chave principal que se refere à chave filho CustomerID na tabela Sales.Customer. A informação fornecida em <sql:relation> não é suficiente para identificar de forma única as linhas na tabela principal (Sales.SalesOrderHeader). Portanto, sem a anotação sql:key-fields , a hierarquia gerada é imprecisa.

Com os campos sql:key especificados em <Order>, a anotação identifica de forma única as linhas no pai (tabela Sales.SalesOrderHeader), e os seus elementos filhos aparecem abaixo do pai.

Este é o esquema:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
<xsd:annotation>  
  <xsd:appinfo>  
    <sql:relationship name="OrdCust"  
        parent="Sales.SalesOrderHeader"  
        parent-key="CustomerID"  
        child="Sales.Customer"  
        child-key="CustomerID" />  
  </xsd:appinfo>  
</xsd:annotation>  
  <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"   
               sql:key-fields="SalesOrderID">  
   <xsd:complexType>  
     <xsd:sequence>  
     <xsd:element name="Customer" sql:relation="Sales.Customer"   
                       sql:relationship="OrdCust"  >  
       <xsd:complexType>  
         <xsd:attribute name="CustID" sql:field="CustomerID" />  
         <xsd:attribute name="SoldBy" sql:field="SalesPersonID" />  
       </xsd:complexType>  
     </xsd:element>  
     </xsd:sequence>  
     <xsd:attribute name="SalesOrderID" type="xsd:integer" />  
     <xsd:attribute name= "CustomerID" type="xsd:string" />  
    </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
Para criar uma amostra funcional deste esquema
  1. Copie o código do esquema acima e cole num ficheiro de texto. Guarde o ficheiro como KeyFields1.xml.

  2. Copie o modelo seguinte e cole-o num ficheiro de texto. Guarda o ficheiro como KeyFields1T.xml no mesmo diretório onde guardaste KeyFields1.xml. A consulta XPath no template devolve todos os elementos da< Ordem> com um CustomerID inferior a 3.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
        <sql:xpath-query mapping-schema="KeyFields1.xml">  
            /Order[@CustomerID < 3]  
        </sql:xpath-query>  
    </ROOT>  
    

    O caminho do diretório especificado para o esquema de mapeamento (KeyFields1.xml) é relativo ao diretório onde o modelo é guardado. Um caminho absoluto também pode ser especificado, por exemplo:

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

    Para mais informações, consulte Utilização de ADO para Executar Consultas SQLXML.

Este é o conjunto parcial de resultados:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
    <Order SalesOrderID="43860" CustomerID="1">  
       <Customer CustID="1" SoldBy="280"/>  
    </Order>  
    <Order SalesOrderID="44501" CustomerID="1">  
       <Customer CustID="1" SoldBy="280"/>  
    </Order>  
    <Order SalesOrderID="45283" CustomerID="1">  
       <Customer CustID="1" SoldBy="280"/>  
    </Order>  
    .....  
</ROOT>  

B. Especificar sql:key-fields para produzir um aninhamento adequado no resultado

No esquema seguinte, não existe uma hierarquia especificada usando <sql:relationship>. O esquema ainda requer especificar a anotação sql:key-fields para identificar de forma única os colaboradores na tabela HumanResources.Employee.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
  <xsd:element name="HumanResources.Employee" sql:key-fields="EmployeeID" >  
   <xsd:complexType>  
     <xsd:sequence>  
        <xsd:element name="Title">  
          <xsd:complexType>  
            <xsd:simpleContent>  
              <xsd:extension base="xsd:string">  
                 <xsd:attribute name="EmployeeID" type="xsd:integer" />  
              </xsd:extension>  
            </xsd:simpleContent>  
          </xsd:complexType>  
        </xsd:element>  
     </xsd:sequence>  
   </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
Para criar uma amostra funcional deste esquema
  1. Copie o código do esquema acima e cole num ficheiro de texto. Guarde o ficheiro como KeyFields2.xml.

  2. Copie o modelo seguinte e cole-o num ficheiro de texto. Guarda o ficheiro como KeyFields2T.xml no mesmo diretório onde guardaste KeyFields2.xml. A consulta XPath no modelo devolve todos os <elementos HumanResources.Employee> :

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

    O caminho do diretório especificado para o esquema de mapeamento (KeyFields2.xml) é relativo ao diretório onde o modelo é guardado. Um caminho absoluto também pode ser especificado, por exemplo:

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

    Para mais informações, consulte Utilização de ADO para Executar Consultas SQLXML.

Este é o resultado:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <HumanResources.Employee>  
    <Title EmployeeID="1">Production Technician - WC60</Title>   
  </HumanResources.Employee>  
  <HumanResources.Employee>  
    <Title EmployeeID="2">Marketing Assistant</Title>   
  </HumanResources.Employee>  
  <HumanResources.Employee>  
    <Title EmployeeID="3">Engineering Manager</Title>   
  </HumanResources.Employee>  
  ...  
</ROOT>