Condividi tramite


Utilizzo di schemi XSD con annotazioni in query (SQLXML 4.0)

È possibile specificare query su uno schema con annotazioni per recuperare dati dal database specificando in un modello query XPath sullo schema XSD.

L'elemento <sql:xpath-query> consente di specificare una query XPath sulla vista XML definita dallo schema con annotazioni. Lo schema con annotazioni su cui verrà eseguita la query XPath viene identificato tramite l'attributo mapping-schema dell'elemento <sql:xpath-query>.

I modelli sono documenti XML validi che contengono una o più query. Le query FOR XML e XPath restituiscono un frammento del documento. I modelli fungono da contenitori per i frammenti del documento e offrono in tal modo un metodo per specificare un singolo elemento di livello principale.

Negli esempi inclusi in questo argomento vengono utilizzati modelli per specificare una query XPath su uno schema con annotazioni per recuperare dati dal database.

Si consideri, ad esempio, lo schema con annotazioni seguente:

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

A scopo illustrativo, lo schema XSD viene archiviato in un file denominato Schema2.xml. È quindi possibile specificare una query XPath sullo schema con annotazioni nel file di modello seguente (Schema2T.xml):

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

È infine possibile creare e utilizzare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire la query come parte di un file di modello. Per ulteriori informazioni, vedere Utilizzo di ADO per eseguire query SQLXML 4.0.

Utilizzo di schemi di mapping inline

È possibile includere uno schema con annotazioni direttamente in un modello e quindi specificare nel modello una query XPath sullo schema inline. Il modello può essere anche un updategram.

Un modello può includere più schemi inline. Per utilizzare uno schema inline incluso in un modello, specificare l'attributo id con un valore univoco nell'elemento <xsd:schema> e quindi utilizzare #idvalue per fare riferimento allo schema inline. L'attributo id ha un comportamento identico all'attributo sql:id ({urn:schemas-microsoft-com:xml-sql}id) utilizzato negli schemi XDR. Per ulteriori informazioni, vedere Utilizzo di schemi XDR con annotazioni in query (obsoleti in SQLXML 4.0).

Nel modello seguente, ad esempio, vengono specificati due schemi con annotazioni inline:

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

Il modello specifica inoltre due query XPath. Ognuno degli elementi <xpath-query> identifica in modo univoco lo schema di mapping specificando l'attributo mapping-schema.

Quando si specifica uno schema inline nel modello, è necessario specificare anche l'annotazione sql:is-mapping-schema nell'elemento <xsd:schema>. sql:is-mapping-schema utilizza un valore booleano (0=false, 1=true). Uno schema inline con sql:is-mapping-schema="1" viene considerato uno schema con annotazioni inline e non viene restituito nel documento XML.

L'annotazione sql:is-mapping-schema appartiene allo spazio dei nomi del modello urn:schemas-microsoft-com:xml-sql.

Per testare questo esempio, salvare il modello (InlineSchemaTemplate.xml) in una directory locale, quindi creare e utilizzare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire il modello. Per ulteriori informazioni, vedere Utilizzo di ADO per eseguire query SQLXML 4.0.

Oltre a specificare l'attributo mapping-schema nell'elemento <sql:xpath-query> in un modello (quando è presente una query XPath) o nell'elemento <updg:sync> in un updategram, è possibile effettuare le operazioni seguenti:

  • Specificare l'attributo mapping-schema nell'elemento (dichiarazione globale) <ROOT> nel modello. Questo schema di mapping diventa quindi lo schema predefinito che verrà utilizzato da tutti i nodi XPath e updategram che non dispongono di alcuna annotazione mapping-schema esplicita.

  • Specificare l'attributo mapping schema utilizzando l'oggetto ADO Command.

L'attributo mapping-schema specificato nell'elemento <xpath-query> o <updg:sync> ha precedenza maggiore, mentre l'oggetto ADO Command ha precedenza minore.

Si noti che se si specifica una query XPath in un modello e non si definisce uno schema di mapping su cui eseguire la query XPath, la query XPath viene considerata una query di tipo dbobject. Si consideri, ad esempio, il modello seguente:

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

Il modello specifica una query XPath ma non specifica uno schema di mapping. La query viene pertanto considerata una query di tipo dbobject in cui Production.ProductPhotoè il nome della tabella e @ProductPhotoID='100' è un predicato che individua una foto del prodotto con valore ID 100. @LargePhoto è la colonna da cui recuperare il valore.