Share via


Usando esquemas XSD anotados em consultas (SQLXML 4.0)

Você pode especificar consultas com relação a um esquema anotado para recuperar dados do banco de dados especificando consultas XPath em um modelo com relação ao esquema XSD.

O elemento <sql:xpath-query> permite especificar uma consulta XPath com relação à exibição de XML que é definida pelo esquema anotado. O esquema anotado com relação ao qual a consulta XPath deverá ser executada é identificado usando o atributo mapping-schema do elemento <sql:xpath-query>.

Os modelos são documentos XML válidos que contêm uma ou mais consultas. As consultas FOR XML e XPath retornam um fragmento de documento. Os modelos atuam como contêineres dos fragmentos de documento; os modelos oferecem uma maneira de especificar um único elemento de nível superior.

Os exemplos deste tópico usam modelos para especificar uma consulta XPath com relação a um esquema anotado para recuperar dados do banco 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 de ilustração, este esquema XSD é armazenado em arquivo nomeado Schema2.xml. Você poderá ter uma consulta XPath com relação ao esquema anotado especificado no seguinte arquivo de modelo (Schema2T.xml):

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

Em seguida, você poderá criar e usar o Script de Teste SQLXML 4.0 (Sqlxml4test.vbs) para executar a consulta como parte de um arquivo de modelo. Para obter mais informações, consulte Usando o ADO para executar consultas do SQLXML 4.0.

Usando esquemas de mapeamento embutidos

Um esquema anotado pode ser incluído diretamente em um modelo e, em seguida, uma consulta XPath pode ser especificada no modelo com relação ao esquema embutido. O modelo pode também ser um diagrama de atualização.

Um modelo pode incluir vários esquemas embutidos. Para usar um esquema embutido que esteja incluído em um modelo, especifique o atributo id com um valor exclusivo no elemento <xsd:schema> e, em seguida, use #idvalue para fazer referência ao esquema embutido. O atributo id é idêntico em comportamento ao sql:id ({urn:schemas-microsoft-com:xml-sql}id) usado em esquemas XDR. Para obter mais informações, consulte Usando esquemas XDR anotados em consultas (substituídos no SQLXML 4.0).

Por exemplo, o seguinte modelo especifica dois esquemas anotados embutidos:

<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 <xpath-query> identifica exclusivamente o esquema de mapeamento especificando o atributo mapping-schema.

Quando você especificar um esquema embutido no modelo, a anotação sql:is-mapping-schema também deverá ser especificada no elemento <xsd:schema>. A anotação sql:is-mapping-schema adota um valor Booleano (0=false, 1=true). Um esquema embutido com sql:is-mapping-schema="1" é tratado como esquema anotado embutido e não é retornado no documento XML.

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

Para testar este exemplo, salve o modelo (InlineSchemaTemplate.xml) em um diretório local e, em seguida, 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.

Além de especificar o atributo mapping-schema no elemento <sql:xpath-query> em um modelo (quando há uma consulta Xpath), ou no elemento <updg:sync> em um diagrama de atualização, você pode fazer o seguinte:

  • Especificar o atributo mapping-schema no elemento <ROOT> (declaração global) no modelo. Este esquema de mapeamento se torna o esquema padrão que será usado por todos os XPaths e nós de diagrama de atualização que não têm nenhuma anotação mapping-schema explícita.

  • Especificar o atributo mapping schema usando o objeto Command do ADO.

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

Observe que se você especificar uma consulta XPath em um modelo e não especificar um esquema de mapeamento com relação ao qual a consulta XPath será executada, a consulta XPath será 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, essa consulta é tratada como uma consulta do tipo dbobject em que Production.ProductPhotoé o nome da tabela e @ProductPhotoID='100' é um predicado que localiza uma foto do produto com o valor de ID 100. @LargePhoto é a coluna da qual recuperar o valor.