Partilhar via


Utilização de Esquemas XSD Anotados em Consultas (SQLXML 4.0)

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

Pode especificar consultas contra um esquema anotado para obter dados da base de dados, especificando consultas XPath num template contra o esquema XSD.

O <elemento sql:xpath-query> permite-lhe especificar uma consulta XPath contra a vista XML definida pelo esquema anotado. O esquema anotado contra o qual a consulta XPath deve ser executada é identificado usando o atributo schema de mapeamento do <elemento sql:xpath-quer> .

Os templates são documentos XML válidos que contêm uma ou mais consultas. As consultas FOR XML e XPath devolvem um fragmento de documento. Os modelos funcionam como recipientes para os fragmentos do documento; Assim, os templates fornecem uma forma de especificar um único elemento de nível superior.

Os exemplos deste tópico usam modelos para especificar uma consulta XPath contra um esquema anotado para recuperar dados da base de dados.

Por exemplo, considere este esquema anotado:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
  <xsd:element name="Person.Contact" >  
     <xsd:complexType>  
       <xsd:attribute name="ContactID" type="xsd:string" />   
       <xsd:attribute name="FirstName" type="xsd:string" />   
       <xsd:attribute name="LastName"  type="xsd:string" />   
     </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  

Para fins ilustrativos, este esquema XSD é armazenado num ficheiro chamado Schema2.xml. Poderia então fazer uma consulta XPath contra o esquema anotado especificado no seguinte ficheiro modelo (Schema2T.xml):

<sql:xpath-query   
     xmlns:sql="urn:schemas-microsoft-com:xmlsql"  
     >  
          Person.Contact[@ContactID="1"]  
</sql:xpath-query>  

Pode então criar e usar o Script de Teste SQLXML 4.0 (Sqlxml4test.vbs) para executar a consulta como parte de um ficheiro modelo. Para mais informações, consulte Annotated XDR Schemas (obsoletos no SQLXML 4.0).

Utilização de esquemas de mapeamento em linha

Um esquema anotado pode ser incluído diretamente num modelo, e depois uma consulta XPath pode ser especificada no modelo contra o esquema inline. O modelo também pode ser um updategram.

Um modelo pode incluir múltiplos esquemas inline. Para usar um esquema inline incluído num modelo, especifique o atributo id com um valor único no <elemento xsd:schema> e depois use #idvalue para referenciar o esquema inline. O atributo id é idêntico em comportamento ao sql:id ({urn:schemas-microsoft-com:xml-sql}id) usado em esquemas XDR.

Por exemplo, o seguinte modelo especifica dois esquemas anotados em linha:

<ROOT xmlns:sql='urn:schemas-microsoft-com:xml-sql'>  
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'  
        xmlns:ms='urn:schemas-microsoft-com:mapping-schema'  
        id='InLineSchema1' sql:is-mapping-schema='1'>  
  <xsd:element name='Employees' ms:relation='HumanResources.Employee'>  
    <xsd:complexType>  
      <xsd:attribute name='LoginID'   
                     type='xsd:string'/>  
      <xsd:attribute name='Title'   
                     type='xsd:string'/>  
    </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
  
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'  
        xmlns:ms='urn:schemas-microsoft-com:mapping-schema'  
        id='InLineSchema2' sql:is-mapping-schema='1'>  
  <xsd:element name='Contacts' ms:relation='Person.Contact'>  
    <xsd:complexType>  
  
      <xsd:attribute name='ContactID'   
                     type='xsd:string' />  
      <xsd:attribute name='FirstName'   
                     type='xsd:string' />  
      <xsd:attribute name='LastName'   
                     type='xsd:string' />  
    </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
  
<sql:xpath-query xmlns:sql='urn:schemas-microsoft-com:xml-sql'   
        mapping-schema='#InLineSchema1'>  
    /Employees[@LoginID='adventure-works\guy1']  
</sql:xpath-query>  
  
<sql:xpath-query xmlns:sql='urn:schemas-microsoft-com:xml-sql'   
        mapping-schema='#InLineSchema2'>  
    /Contacts[@ContactID='1']  
</sql:xpath-query>  
</ROOT>  

O modelo também especifica duas consultas XPath. Cada um dos <elementos da consulta> xpath identifica de forma única o esquema de mapeamento ao especificar o atributo do schema de mapeamento.

Quando especifica um esquema inline no modelo, a anotação sql:is-maping-schema também deve ser especificada no <elemento xsd:schema> . O esquema de mapeamento sql:is assume um valor booleano (0=falso, 1=verdadeiro). Um esquema inline com sql:is-maping-schema="1" é tratado como esquema anotado em linha e não é devolvido no documento XML.

A anotação sql:is-maping-schema pertence ao espaço de nomes modelo urn:schemas-microsoft-com:xml-sql.

Para testar este exemplo, guarde o modelo (InlineSchemaTemplate.xml) num diretório local e depois 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 SQLXML 4.0.

Para além de especificar o atributo mapeamento-schema no <elemento sql:xpath-query> num template (quando existe uma consulta XPath), ou no <elemento updatedg:sync> num updategram, pode fazer o seguinte:

  • Especifique o atributo schema de mapeamento no <elemento ROOT> (declaração global) no modelo. Este esquema de mapeamento torna-se então o esquema padrão que será usado por todos os nós XPath e updategram que não possuem anotação explícita do esquema de mapeamento .

  • Especifique o atributo do esquema de mapeamento usando o objeto ADO Command .

O atributo schema de mapeamento especificado no <elemento xpath-query> ou <updg:sync> tem a precedência mais alta; o objeto Command ADO tem a precedência mais baixa.

Note que, se especificar uma consulta XPath num template e não especificar um esquema de mapeamento contra o qual a consulta XPath é executada, a consulta XPath é tratada como uma consulta do tipo dbobject . Por exemplo, considere este modelo:

<sql:xpath-query   
     xmlns:sql="urn:schemas-microsoft-com:xmlsql">  
          Production.ProductPhoto[@ProductPhotoID='100']/@LargePhoto  
</sql:xpath-query>  

O modelo especifica uma consulta XPath, mas não especifica um esquema de mapeamento. Portanto, esta consulta é tratada como uma consulta do tipo dbobject em que Production.ProductPhoto é o nome da tabela e @ProductPhotoID='100' é um predicado que encontra uma foto de produto com o valor ID de 100. @LargePhoto é a coluna a partir da qual se deve recuperar o valor.