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

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 portant 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 inséré 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 inséré. L'attribut id a un comportement identique à 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 manière unique le schéma de mappage en spécifiant l'attribut mapping-schema.

Lorsque vous spécifiez un schéma inséré 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 accepte une valeur booléenne (0 = false, 1 = true). Un schéma inséré avec sql:is-mapping-schema="1" est considéré comme un schéma annoté inséré et n'est pas retourné dans le document XML.

L'annotation sql:is-mapping-schema appartient à l'espace de noms du 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.

Outre la spécification de 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 (updategram), 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 ensuite le schéma par défaut utilisé par l'ensemble des nœuds XPath et nœuds de code de mise à jour (updategram) qui n'ont pas d'annotation mapping-schema explicite.

  • Spécifiez l'attribut mapping schema en utilisant l'objet Command ADO.

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

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

<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' représente un prédicat qui recherche une photo du produit avec un ID dont la valeur est égale à 100. @LargePhoto est la colonne à partir de laquelle la valeur doit être récupérée.