Partager via


Identification de colonnes clés à l'aide de sql:key-fields (schéma XDR)

Important

Cette rubrique est fournie en guise de référence pour les applications héritées. Aucun travail de développement ne sera effectué dans le futur sur cette fonctionnalité. Évitez d'utiliser cette fonctionnalité dans un nouveau travail de développement. Au lieu de cela, utilisez des schémas XSD annotés pour créer des vues XML. Pour plus d'informations, consultez Introduction aux schémas XSD annotés (SQLXML 4.0). Vous pouvez convertir des schémas XDR annotés existants en schémas XSD. Pour plus d'informations, consultez Conversion de schémas XDR annotés en schémas XSD équivalents (SQLXML 4.0).

Lorsqu'une requête XPath est spécifiée contre le schéma XDR, les informations de clés sont requises dans la plupart des cas pour obtenir une imbrication correcte dans le résultat. La spécification de l'annotation sql:key-fields est une méthode permettant de garantir que la hiérarchie appropriée est générée.

[!REMARQUE]

Pour produire une imbrication correcte dans le résultat, il est recommandé de spécifier sql:key-fields dans tous les schémas.

Dans de nombreux cas, il est nécessaire de comprendre comment identifier de manière unique les lignes d'une table afin de générer la hiérarchie XML appropriée. L'annotation sql:key-fields peut être ajoutée à l'<élément> et à <ElementType> pour identifier la ou les colonnes qui identifient de manière unique des lignes dans la table.

La valeur de sql:key-fields identifie le ou les colonnes qui identifient de manière unique les lignes dans la relation spécifiée dans l'objet <ElementType>. Si plusieurs colonnes sont requises pour identifier une ligne de manière unique, les valeurs de colonnes sont séparées par un espace.

L'annotation sql:key-fields doit être spécifiée dans un élément contenant un élément enfant et un objet <sql:relationship>, défini entre l'élément et l'enfant, qui ne fournit pas la clé primaire de la table spécifiée dans l'élément parent.

Exemples

Pour créer des exemples fonctionnels à l'aide des exemples suivants, vous devez remplir certaines conditions. Pour plus d'informations, consultez Configuration requise pour l'exécution des exemples SQLXML.

A. Produire l'imbrication appropriée lorsque <sql:relationship> ne fournit pas d'informations suffisantes

Cet exemple montre où sql:key-fields doit être spécifié.

Prenons le schéma suivant : il spécifie la hiérarchie entre les éléments <Order> et <Customer>, dans lesquels l'élément <Order> est le parent et l'élément <Customer> est un enfant.

La balise <sql:relationship> est utilisée pour spécifier la relation parent-enfant. La balise <sql:relationship> identifie CustomerID comme foreign-key dans la table Sales.SalesOrderHeader, ce qui fait référence à la clé CustomerID dans la table Sales.Customer. Ces informations fournies dans <sql:relationship> ne sont pas suffisantes pour identifier de manière unique des lignes dans la table parente (Sales.SalesOrderHeader). Par conséquent, la hiérarchie générée est inexacte sans sql:key-fields.

Avec sql:key-fields spécifié sur <Order>, l'annotation identifie de manière unique les lignes dans le parent (table Sales.SalesOrderHeader) et ses éléments enfants apparaissent sous son parent.

Voici le schéma :

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <ElementType name="Customer" sql:relation="Sales.Customer">
    <AttributeType name="CustomerID" />
    <attribute type="CustomerID" />
  </ElementType>

  <ElementType name="Order" sql:relation="Sales.SalesOrderHeader" 
                            sql:key-fields="SalesOrderID" >
    <AttributeType name="SalesOrderID" />
    <AttributeType name="CustomerID" />
 
    <attribute type="SalesOrderID" />
    <attribute type="CustomerID" />
    <element type="Customer" >
             <sql:relationship
                         key-relation="Sales.SalesOrderHeader"
                         key="CustomerID"
                         foreign-relation="Sales.Customer"
                         foreign-key="CustomerID" />
    </element>
     </ElementType>
</Schema>

Pour tester un exemple fonctionnel de ce schéma

  1. Copiez le code du schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier en tant que KeyFieldsA-Xdr.xml.

  2. Copiez le modèle suivant et collez-le dans un fichier texte. Enregistrez le fichier en tant que KeyFieldsA-XdrT.xml dans le même répertoire où vous avez enregistré KeyFieldsA-Xdr.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="KeyFieldsA-Xdr.xml">
        /Order
      </sql:xpath-query>
    </ROOT>
    

    Le chemin d'accès au répertoire spécifié pour le schéma de mappage (KeyFieldsA-Xdr.xml) est relatif au répertoire où le modèle est enregistré. Vous pouvez également spécifier un chemin d'accès absolu, par exemple :

    mapping-schema="C:\MyDir\KeyFieldsA-Xdr.xml"
    
  3. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.

    Pour plus d'informations, consultez Utilisation d'ADO pour exécuter des requêtes SQLXML 4.0.

Voici le jeu de résultats obtenu :

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Order SalesOrderID="43659" CustomerID="676">
    <Customer CustomerID="676" /> 
  </Order>
  <Order SalesOrderID="43660" CustomerID="117">
    <Customer CustomerID="117" /> 
  </Order>
  <Order SalesOrderID="43661" CustomerID="442">
    <Customer CustomerID="442" /> 
  </Order>
  ...
</ROOT>

B. Spécifier sql:key-fields afin de produire l'imbrication correcte dans le résultat

Dans ce schéma, il n'y a aucune hiérarchie spécifiée à l'aide de <sql:relationship>. Le schéma requiert encore l'annotation sql:key-fields spécifiée afin d'identifier de manière unique les employés dans la table HumanResources.Employee.

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
   xmlns:dt="urn:schemas-microsoft-com:datatypes"
   xmlns:sql="urn:schemas-microsoft-com:xml-sql">
   <ElementType name="Title" content="textOnly"  >
      <AttributeType name="EmployeeID" />
      <attribute type="EmployeeID" />
   </ElementType>

   <ElementType name="HumanResources.Employee" sql:key-fields="EmployeeID" >
      <element type="Title" />
   </ElementType>
</Schema>

Pour tester un exemple fonctionnel de ce schéma

  1. Copiez le code du schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier en tant que KeyFieldsB-Xdr.xml.

  2. Copiez le modèle suivant et collez-le dans un fichier texte. Enregistrez le fichier en tant que KeyFieldsB-XdrT.xml dans le même répertoire où vous avez enregistré KeyFieldsB-Xdr.xml. La requête XPath dans le modèle retourne tous les éléments <Order>.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="KeyFieldsB-Xdr.xml">
        /HumanResources.Employee
      </sql:xpath-query>
    </ROOT>
    

    Le chemin d'accès au répertoire spécifié pour le schéma de mappage (KeyFieldsB-Xdr.xml) est relatif au répertoire où le modèle est enregistré. Vous pouvez également spécifier un chemin d'accès absolu, par exemple :

    mapping-schema="C:\MyDir\KeyFieldsB-Xdr.xml"
    
  3. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.

    Pour plus d'informations, consultez Utilisation d'ADO pour exécuter des requêtes SQLXML 4.0.

Voici une partie du jeu de résultats :

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <HumanResources.Employee>
    <Title EmployeeID="1">Production Technician - WC60</Title> 
  </HumanResources.Employee>
  <HumanResources.Employee>
    <Title EmployeeID="2">Marketing Assistant</Title> 
  </HumanResources.Employee>
  <HumanResources.Employee>
    <Title EmployeeID="3">Engineering Manager</Title> 
  </HumanResources.Employee>
   ...
</ROOT>