Partager via


Création d'attributs de type ID, IDREF et IDREFS valides à l'aide de sql:id-prefix (schéma XDR)

Important

Cette rubrique est fournie à titre de référence pour les applications héritées. Cette fonctionnalité ne fera plus l'objet d'aucun travail de développement. Évitez de l'utiliser dans vos nouveaux travaux de développement. Utilisez à la place 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 les 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).

Un attribut peut être spécifié comme étant un attribut de type ID. Les attributs spécifiés comme IDREF ou IDREFS peuvent être utilisés pour faire référence aux attributs de type ID, ce qui permet d'établir des liens à l'intérieur du document.

ID, IDREF et IDREFS correspondent aux relations PK/FK (clé primaire/clé étrangère) dans la base de données, avec quelques différences. Dans le document XML, les valeurs des attributs de type ID doivent être distinctes. Si vous avez des attributs CustomerID et SalesOrderID dans un document XML, ces valeurs doivent être distinctes. Toutefois, dans une base de données, les colonnes CustomerID et SalesOrderID peuvent avoir les mêmes valeurs (par exemple, CustomerID = 1 et OrderID = 1 sont valides dans la base de données).

Pour que les attributs ID, IDREF et IDREFS soient valides :

  • La valeur d'ID doit être unique dans le document XML.

  • Pour chaque IDREF et IDREFS, les valeurs d'ID référencées doivent être dans le document XML.

  • La valeur d'un ID, IDREF ou IDREFS doit être un jeton nommé (par exemple, la valeur entière 101 ne peut pas être une valeur d'ID).

  • Les attributs de type ID, IDREF et IDREFS ne peuvent pas être mappés à des colonnes de type text, ntext, image ou de tout autre type de données binaire (par exemple, timestamp).

Si un document XML contient plusieurs ID, l'annotation sql:id-prefix est spécifiée pour vous assurer que les valeurs sont uniques. . L'annotation The sql:id-prefix est également utilisée pour créer des jetons nommés à partir de nombres. La valeur spécifiée pour sql:id-prefix doit être un caractère de nom valide.

L'attribut sql:id-prefixajoute les valeurs d'ID, IDREF et IDREFS avec une chaîne, ce qui les rend uniques. Aucune vérification n'est effectuée pour garantir la validité des préfixes et l'unicité des valeurs d'ID, IDREF ou IDREFS.

L'attribut sql:id-prefixest ignoré sur des attributs qui ne sont pas de type ID, IDREF ni IDREFS.

[!REMARQUE]

Chaque valeur des attributs ID, IDREF et IDREFS est limitée à 4 000 caractères, préfixe compris (le cas échéant).

Exemples

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

A. Spécifier sql:id-prefix pour un attribut de type ID

Dans ce schéma XDR, les attributs SalesOrderID et CustomerID sont déclarés en tant que type d'ID. Pour garantir que les ID sont uniques et valides, l'annotation sql:id-prefix est spécifiée pour ces attributs :

<?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="Order" sql:relation="Sales.SalesOrderHeader" sql:key-fields="SalesOrderID">
    <AttributeType name="SalesOrderID" dt:type="id" sql:id-prefix="Ord-" />
    <AttributeType name="OrderDate" />
 
    <attribute type="SalesOrderID" />
    <attribute type="OrderDate" />
  </ElementType>

  <ElementType name="Customer" sql:relation="Sales.Customer">
    <AttributeType name="CustomerID" dt:type="id" />
    <attribute type="CustomerID" />
    <AttributeType name="OrderList" dt:type="idrefs"
                                 sql:id-prefix="Ord-" />
    <attribute type="OrderList" sql:relation="Sales.SalesOrderHeader" sql:field="SalesOrderID">
        <sql:relationship
                key-relation="Sales.Customer"
                key="CustomerID"
                foreign-relation="Sales.SalesOrderHeader"
                foreign-key="CustomerID" />
    </attribute>
    <element type="Order">
        <sql:relationship key-relation="Sales.SalesOrderHeader"
                          key="SalesOrderID"
                          foreign-relation="Sales.Customer"
                          foreign-key="SalesOrderID" />
    </element>
  </ElementType>
</Schema>

Pour tester un exemple de requête XPath sur le schéma

  1. Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom sqlPrefix-Xdr.xml.

  2. Copiez le modèle suivant et collez-le dans un fichier texte. Enregistrez le fichier sous le nom sqlPrefix-XdrT.xml dans le même répertoire où vous avez enregistré sqlPrefix-Xdr.xml. La requête XPath dans le modèle retourne les sous-éléments <Customer> et <Order> où CustomerID a la valeur 1.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="sqlPrefix-Xdr.xml">
        Customer[@CustomerID="1"]
      </sql:xpath-query>
    </ROOT>
    

    Le chemin d'accès au répertoire spécifié pour le schéma de mappage (sqlPrefix-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\sqlPrefix-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.

Le jeu de résultats obtenu est le suivant :

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Customer CustomerID="1" OrderIDList="Ord-43860 Ord-44501 Ord-45283 Ord-46042">
    <Order SalesOrderID="Ord-43860" OrderDate="2001-08-01T00:00:00" /> 
    <Order SalesOrderID="Ord-44501" OrderDate="2001-11-01T00:00:00" /> 
    <Order SalesOrderID="Ord-45283" OrderDate="2002-02-01T00:00:00" /> 
    <Order SalesOrderID="Ord-46042" OrderDate="2002-05-01T00:00:00" /> 
  </Customer>
</ROOT>