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

Si applica a: SQL Server Azure SQL Database

È 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 in base al quale deve essere eseguita la query XPath viene identificato usando 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 altre informazioni, vedere Annotated XDR Schemas (Depreated in SQLXML 4.0) (Schemi XDR con annotazioni deprecate 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 nel comportamento a 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, è 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 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 mapping-schema nell'elemento <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 mapping-schema nell'elemento <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 dello schema di mapping .

  • Specificare l'attributo dello schema di mapping usando l'oggetto ADO Command .

L'attributo dello schema di mapping specificato nell'elemento <xpath-query> o <updg:sync> ha la precedenza più alta. L'oggetto 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 come una 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 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.