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 annotato. Lo schema annotato in cui deve essere eseguita la query XPath viene identificata usando l'attributo dell'elemento mapping-schema<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 altre informazioni, vedere Annotated XDR Schemas (Deprecato in 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 usare uno schema inline incluso in un modello, specificare l'attributo ID con un valore univoco nell'elemento <xsd:schema> e quindi usare #idvalue per fare riferimento allo schema inline. L'attributo id è identico al comportamento sql:id ({urn:schemas-microsoft-com:xml-sql}id) usato negli schemi XDR.

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, l'annotazione sql:is-mapping-schema deve essere specificata anche 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 come schema annotato 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 altre informazioni, vedere Uso di ADO per eseguire query SQLXML 4.0.

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

  • Specificare l'attributo nell'elemento mapping-schema<ROOT> (dichiarazione globale) 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 specificato nell'elemento <xpath-query> o <updg:sync> ha la precedenza più alta. L'oggetto mapping-schema ADO Command ha la precedenza più bassa.

Si noti che se si specifica una query XPath in un modello e non si specifica uno schema di mapping a cui viene eseguita la query XPath, la query XPath viene considerata come query di tipo dbobject . Considerare 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. Pertanto, questa query viene considerata come query di tipo dbobject in cui Production.ProductPhoto è il nome della tabella e @ProductPhotoID='100' è un predicato che trova una foto del prodotto con il valore ID 100. @LargePhoto è la colonna da cui recuperare il valore.