Condividi tramite


Uso di schemi XSD con annotazioni nelle query (SQLXML 4.0)

È possibile specificare query su uno schema con annotazioni per recuperare i dati dal database specificando query XPath in un modello rispetto allo 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 in base al quale deve essere eseguita la query XPath viene identificato 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 di documento. I modelli fungono da contenitori per i frammenti di documento; i modelli forniscono quindi un modo per specificare un singolo elemento di primo livello.

Gli esempi in questo argomento usano modelli per specificare una query XPath su uno schema con annotazioni per recuperare i dati dal database.

Si consideri ad esempio questo schema con annotazioni:

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

Ai fini dell'illustrazione, questo schema XSD viene archiviato nel file denominato Schema2.xml. È quindi possibile avere una query XPath sullo schema con annotazioni specificato nel file di modello seguente (Schema2T.xml):

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

È quindi possibile creare e usare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire la query come parte di un file modello. Per altre informazioni, vedere Annotated XDR Schemas (Deprecato in SQLXML 4.0).

Uso degli schemi di mapping inline

Uno schema con annotazioni può essere incluso direttamente in un modello e quindi è possibile specificare una query XPath nel modello rispetto allo schema inline. Il modello può anche essere 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 nel comportamento a sql:id ({urn:schemas-microsoft-com:xml-sql}id) usato negli schemi XDR.

Ad esempio, il modello seguente specifica 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 anche 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 accetta un valore booleano (0=false, 1=true). Uno schema inline con sql:is-mapping-schema="1" viene considerato come schema con annotazioni inline e non viene restituito nel documento XML.

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

Per testare questo esempio, salvare il modello (InlineSchemaTemplate.xml) in una directory locale e quindi creare e usare 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 mapping-schema<sql:xpath-query> in un modello (quando è presente una query XPath) o nell'elemento <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à usato da tutti i nodi XPath e updategram senza annotazione esplicita mapping-schema .

  • Specificare l'attributo mapping schema usando 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 in base al quale viene eseguita la query XPath, la query XPath viene considerata una query di tipo dbobject . Si consideri ad esempio questo modello:

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