Utilisation de schémas XSD annotés dans les requêtes (SQLXML 4.0)

S’applique à :SQL ServerAzure SQL Database

Vous pouvez spécifier des requêtes sur un schéma annoté afin de récupérer des données de la base de données ; pour ce faire, spécifiez des requêtes XPath dans un modèle par rapport au schéma XSD.

L’élément< sql:xpath-query> vous permet de spécifier une requête XPath sur la vue XML définie par le schéma annoté. Le schéma annoté sur lequel la requête XPath doit être exécutée est identifié à l’aide de l’attribut mapping-schema de l’élément <sql:xpath-query> .

Les modèles sont des documents XML valides qui contiennent une ou plusieurs requêtes. Les requêtes XPath et FOR XML retournent un fragment de document. Les modèles servent de conteneurs pour les fragments de documents ; par conséquent, les modèles offrent un moyen de spécifier un élément unique, de niveau supérieur.

Les exemples de cette rubrique utilisent des modèles pour spécifier une requête XPath portant sur un schéma annoté afin de récupérer des données dans la base de données.

Considérons par exemple ce schéma annoté :

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

Pour les besoins de l'exemple, ce schéma XSD est stocké dans le fichier nommé Schema2.xml. Vous pouvez alors exécuter une requête XPath sur le schéma annoté spécifié dans le fichier modèle suivant (Schema2T.xml) :

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

Vous pouvez ensuite créer et utiliser le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter la requête dans le cadre d'un fichier modèle. Pour plus d’informations, consultez Schémas XDR annotés (déconseillés dans SQLXML 4.0).

Utilisation de schémas de mappage insérés

Un schéma annoté peut être inclus directement dans un modèle ; une requête XPath peut ensuite être spécifiée dans le modèle par rapport au schéma inséré. Le modèle peut également être un code de mise à jour (updategram).

Un modèle peut inclure plusieurs schémas insérés. Pour utiliser un schéma inline inclus dans un modèle, spécifiez l’attribut id avec une valeur unique sur l’élément <xsd:schema> , puis utilisez #idvalue pour référencer le schéma inline. L’attribut id est identique au comportement de sql:id ({urn:schemas-microsoft-com:xml-sql}id) utilisé dans les schémas XDR.

Par exemple, le modèle suivant spécifie deux schémas annotés insérés :

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

Le modèle spécifie également deux requêtes XPath. Chacun des <éléments xpath-query> identifie de façon unique le schéma de mappage en spécifiant l’attribut mapping-schema .

Lorsque vous spécifiez un schéma inline dans le modèle, l’annotation sql:is-mapping-schema doit également être spécifiée sur l’élément <xsd:schema> . Sql :is-mapping-schema prend une valeur booléenne (0=false, 1=true). Un schéma inline avec sql:is-mapping-schema="1 » est traité comme un schéma annoté inline et n’est pas retourné dans le document XML.

L’annotation sql:is-mapping-schema appartient à l’espace de noms de modèle urn:schemas-microsoft-com:xml-sql.

Pour tester cet exemple, enregistrez le modèle (InlineSchemaTemplate.xml) dans un répertoire local, puis créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) afin d'exécuter le modèle. Pour plus d’informations, consultez Utilisation d’ADO pour exécuter des requêtes SQLXML 4.0.

En plus de spécifier l’attribut mapping-schema sur l’élément <sql:xpath-query> dans un modèle (lorsqu’il existe une requête XPath) ou sur <l’élément updg:sync> dans un code de mise à jour, vous pouvez effectuer les opérations suivantes :

  • Spécifiez l’attribut mapping-schema sur l’élément <ROOT> (déclaration globale) dans le modèle. Ce schéma de mappage devient alors le schéma par défaut qui sera utilisé par tous les nœuds XPath et updategram qui n’ont pas d’annotation de schéma de mappage explicite.

  • Spécifiez l’attribut de schéma de mappage à l’aide de l’objet Ado Command .

L’attribut mapping-schema spécifié sur l’élément <xpath-query> ou <updg:sync> a la priorité la plus élevée ; l’objet De commande ADO a la priorité la plus faible.

Notez que si vous spécifiez une requête XPath dans un modèle et que vous ne spécifiez pas de schéma de mappage sur lequel la requête XPath est exécutée, la requête XPath est traitée comme une requête de type dbobject . Considérons par exemple le modèle suivant :

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

Le modèle spécifie une requête XPath mais ne spécifie pas de schéma de mappage. Par conséquent, cette requête est traitée comme une requête de type dbobject dans laquelle Production.ProductPhoto est le nom de la table et @ProductPhotoID=« 100 » est un prédicat qui recherche une photo de produit avec la valeur d’ID 100. @LargePhoto est la colonne à partir de laquelle récupérer la valeur.