Share via


Utilizar esquemas XSD anotados en consultas (SQLXML 4.0)

Puede especificar consultas en un esquema anotado para recuperar datos de la base de datos especificando consultas XPath en una plantilla en el esquema XSD.

El elemento <sql:xpath-query> permite especificar una consulta XPath en la vista XML definida por el esquema anotado. El esquema anotado en el que se ejecutará la consulta XPath se identifica mediante el atributo mapping-schema del elemento <sql:xpath-query>.

Las plantillas son documentos XML válidos que contienen una o varias consultas. Las consultas FOR XML y XPath devuelven un fragmento de documento. Las plantillas actúan como contenedores para los fragmentos de documento; de esta forma, las plantillas proporcionan un modo de especificar un elemento único de nivel superior.

En los ejemplos de este tema se usan plantillas para especificar una consulta XPath en un esquema anotado con objeto de recuperar datos de la base de datos.

Por ejemplo, fíjese 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>

Con fines meramente ilustrativos, este esquema XSD se almacena en un archivo denominado Schema2.xml. A continuación, podría incluir una consulta XPath en el esquema anotado especificado en el siguiente archivo de plantilla (Schema2T.xml):

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

Después, puede crear y usar el script de prueba SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar la consulta como parte de un archivo de plantilla. Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

Usar esquemas de asignación insertados

Un esquema anotado puede incluirse directamente en una plantilla y, después, puede especificarse una consulta XPath en la plantilla en el esquema insertado. La plantilla también puede ser un diagrama de actualización.

Una plantilla puede incluir varios esquemas insertados. Para usar un esquema insertado incluido en una plantilla, especifique el atributo id con un valor único en el elemento <xsd:schema> y, a continuación, use #idvalue para hacer referencia al esquema insertado. El atributo id presenta un comportamiento idéntico al del atributo sql:id ({urn:schemas-microsoft-com:xml-sql}id) que se usa en esquemas XDR. Para obtener más información, vea Utilizar esquemas XDR anotados en consultas (obsoleto en SQLXML 4.0).

Por ejemplo, la plantilla siguiente especifica dos esquemas anotados insertados:

<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>

La plantilla también especifica dos consultas XPath. Cada uno de los elementos <xpath-query> identifica de forma única el esquema de asignación especificando el atributo mapping-schema.

Al especificar un esquema insertado en la plantilla, también debe especificarse la anotación sql:is-mapping-schema en el elemento <xsd:schema>. sql:is-mapping-schema toma un valor booleano (0=false, 1=true). Un esquema insertado con sql:is-mapping-schema="1" se considera como un esquema anotado insertado y no se devuelve en el documento XML.

La anotación sql:is-mapping-schema pertenece al espacio de nombres de plantilla urn:schemas-microsoft-com:xml-sql.

Para probar este ejemplo, guarde la plantilla (InlineSchemaTemplate.xml) en un directorio local y, a continuación, cree y use el script de prueba SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar la plantilla. Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

Además de especificar el atributo mapping-schema en el elemento <sql:xpath-query> de una plantilla (cuando hay una consulta XPath), o en el elemento <updg:sync> de un diagrama de actualización, puede hacer lo siguiente:

  • Especificar el atributo mapping-schema en el elemento <ROOT> (declaración global) de la plantilla. Este esquema de asignación se convierte en el esquema predeterminado que utilizarán todos los nodos XPath y de diagrama de actualización que no tengan ninguna anotación mapping-schema explícita.

  • Especificar el atributo mapping schema mediante el objeto ADO Command.

El atributo mapping-schema especificado en el elemento <xpath-query> o <updg:sync> tiene la máxima prioridad, mientras que el objeto ADO Command tiene la mínima prioridad.

Observe que si especifica una consulta XPath en una plantilla y no especifica ningún esquema de asignación donde ejecutar la consulta XPath, ésta se considera como una consulta de tipo dbobject. Por ejemplo, fíjese en esta plantilla:

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

La plantilla especifica una consulta XPath, pero no especifica ningún esquema de asignación. Por lo tanto, esta consulta se considera como una consulta de tipo dbobject donde Production.ProductPhoto es el nombre de tabla y @ProductPhotoID='100' es un predicado que busca una fotografía del producto cuyo valor de identificador sea igual a 100. @LargePhoto es la columna de la que va a recuperarse el valor.