Partager via


Présentation des codes de mise à jour (SQLXML 4.0)

S’applique à : SQL ServerAzure SQL Database

Vous pouvez modifier (insérer, mettre à jour ou supprimer) une base de données dans Microsoft SQL Server à partir d’un document XML existant à l’aide d’un code de mise à jour ou de la fonction Transact-SQL OPENXML.

La fonction OPENXML modifie une base de données en fragmentant le document XML existant et en fournissant un ensemble de lignes qui peut être passé à une instruction INSERT, UPDATE ou DELETE. Avec OPENXML, les opérations sont effectuées directement sur les tables de base de données. Par conséquent, OPENXML est particulièrement approprié partout où les fournisseurs d'ensembles de lignes, tels qu'une table, peuvent apparaître comme source.

Comme OPENXML, un code de mise à jour vous permet d'insérer, de mettre à jour ou de supprimer des données dans la base de données ; toutefois, un code de mise à jour fonctionne sur les vues XML fournies par le schéma XSD annoté (ou un XDR) ; par exemple, les mises à jour sont appliquées à la vue XML fournie par le schéma de mappage. Le schéma de mappage, à son tour, possède les informations nécessaires pour mapper des éléments et des attributs XML aux tables et colonnes de base de données correspondantes. Le code de mise à jour utilise ces informations de mappage pour mettre à jour les tables et colonnes de base de données.

Remarque

Cette documentation suppose que vous connaissez bien les modèles et la prise en charge du schéma de mappage dans SQL Server. Pour plus d’informations, consultez Présentation des schémas XSD annotés (SQLXML 4.0). Pour les applications héritées qui utilisent XDR, consultez Schémas XDR annotés (déconseillés dans SQLXML 4.0).

Espace de noms requis dans le code de mise à jour

Les mots clés d’un code de mise à jour, tels que <la synchronisation>,< avant> et <après>, existent dans l’espace de noms urn :schemas-microsoft-com :xml-updategram. Le préfixe d'espace de noms employé est arbitraire. Dans cette documentation, le préfixe updg désigne l’espace de noms updategram .

Vérification de la syntaxe

Un code de mise à jour est un modèle avec <synchronisation>, <avant> et< après> des blocs qui forment la syntaxe du code de mise à jour. Le code ci-dessous illustre cette syntaxe dans sa forme la plus simple :

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
  <updg:sync [mapping-schema= "AnnotatedSchemaFile.xml"] >  
    <updg:before>  
        ...  
    </updg:before>  
    <updg:after>  
        ...  
    </updg:after>  
  </updg:sync>  
</ROOT>  

Les définitions ci-dessous décrivent le rôle de chacun de ces blocs :

<avant>
Identifie l'état existant (également appelé « état before ») de l'instance de l'enregistrement.

<après>
Identifie le nouvel état qu'auront les données après modification.

<sync>
Contient les blocs avant> et< après>.< Un bloc de synchronisation> peut contenir plusieurs ensembles de <blocs avant> et< après>.< S’il existe plusieurs ensembles de blocs avant> et< après>, ces blocs (même s’ils sont vides) doivent être spécifiés en tant que paires.< En outre, un code de mise à jour peut avoir plusieurs <blocs de synchronisation> . Chaque <bloc de synchronisation> est une unité de transaction (ce qui signifie que tout ce qui se trouve dans le <bloc de synchronisation> est terminé ou que rien n’est fait). Si vous spécifiez plusieurs blocs de synchronisation> dans un code de mise à jour, l’échec d’un< bloc de synchronisation> n’affecte pas les autres< blocs de synchronisation>.<

Si un code de mise à jour supprime, insère ou met à jour une instance d’enregistrement dépend du contenu des blocs avant> et <après> :<

  • Si une instance d’enregistrement apparaît uniquement dans le <bloc avant> sans instance correspondante dans le <bloc après>, le code de mise à jour effectue une opération de suppression.

  • Si une instance d’enregistrement apparaît uniquement dans le <bloc après> sans instance correspondante dans le <bloc précédent>, il s’agit d’une opération d’insertion.

  • Si une instance d’enregistrement apparaît dans le <bloc avant> et a une instance correspondante dans le <bloc après>, il s’agit d’une opération de mise à jour. Dans ce cas, le code de mise à jour met à jour l’instance d’enregistrement sur les valeurs spécifiées dans le bloc après>.<

Spécification d'un schéma de mappage dans le code de mise à jour

Dans un code de mise à jour, l'abstraction XML fournie par un schéma de mappage (les schémas XSD et XDR sont pris en charge) peut être implicite ou explicite (autrement dit, un code de mise à jour peut fonctionner avec ou sans schéma de mappage spécifié). Si vous ne spécifiez pas de schéma de mappage, le code de mise à jour suppose un mappage implicite (mappage par défaut), où chaque élément du bloc avant> ou <après> est mappé à une table et l’élément enfant ou l’attribut de chaque élément est mappé à une colonne de la base de données.< Si vous spécifiez explicitement un schéma de mappage, les éléments et les attributs dans le code de mise à jour doivent correspondre aux éléments et aux attributs dans le schéma de mappage.

Mappage implicite (par défaut)

Dans la plupart des cas, un code de mise à jour qui effectue des mises à jour simples peut ne pas requérir de schéma de mappage. Dans ce cas, le code de mise à jour compte sur le schéma de mappage par défaut.

Le code de mise à jour ci-dessous illustre un mappage implicite. Dans cet exemple, le code de mise à jour insère un nouveau client dans la table Sales.Customer. Étant donné que ce code de mise à jour utilise le mappage implicite, l’élément <Sales.Customer> est mappé à la table Sales.Customer, et les attributs CustomerID et SalesPersonID correspondent aux colonnes correspondantes de la table Sales.Customer.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
<updg:before>  
</updg:before>  
<updg:after>  
    <Sales.Customer CustomerID="1" SalesPersonID="277" />  
    </updg:after>  
</updg:sync>  
</ROOT>  

Mappage explicite

Si vous spécifiez un schéma de mappage (XSD ou XDR), le code de mise à jour utilise le schéma pour déterminer les tables et colonnes de base de données qui seront mises à jour.

Si le code de mise à jour effectue une mise à jour complexe (par exemple, en insérant des enregistrements dans plusieurs tables en fonction de la relation parent-enfant spécifiée dans le schéma de mappage), vous devez fournir explicitement le schéma de mappage à l’aide de l’attribut mappage-schéma sur lequel le code de mise à jour s’exécute.

Comme un code de mise à jour est un modèle, le chemin d'accès spécifié pour le schéma de mappage dans le code de mise à jour est relatif à l'emplacement du fichier modèle (relatif à l'emplacement où le code de mise à jour est stocké). Pour plus d’informations, consultez Spécification d’un schéma de mappage annoté dans un code de mise à jour (SQLXML 4.0) .

Mappage centré sur les éléments et mappage centré sur les attributs dans les codes de mise à jour

Avec le mappage par défaut (lorsque le schéma de mappage n'est pas spécifié dans le code de mise à jour), les éléments de code de mise à jour sont mappés à des tables et les éléments enfants (dans le cas du mappage centré sur les éléments) et les attributs (dans le cas du mappage centré sur les attributs) sont mappés à des colonnes.

Mappage centré sur les éléments

Dans un code de mise à jour centré sur les éléments, un élément contient des éléments enfants qui désignent les propriétés de l'élément. Pour bénéficier d'un exemple, reportez-vous au code de mise à jour ci-dessous. L’élément Person.Contact> contient les< éléments enfants FirstName> et< LastName.>< Ces éléments enfants sont des propriétés de l’élément <Person.Contact> .

Étant donné que ce code de mise à jour ne spécifie pas de schéma de mappage, le code de mise à jour utilise un mappage implicite, où l’élément <Person.Contact> est mappé à la table Person.Contact et à ses éléments enfants sont mappés aux colonnes FirstName et LastName.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
  <updg:after>  
    <Person.Contact>  
       <FirstName>Catherine</FirstName>  
       <LastName>Abel</LastName>  
    </Person.Contact>  
  </updg:after>  
</updg:sync>  
</ROOT>  

mappage centré sur les attributs

Dans un mappage centré sur les attributs, les éléments ont des attributs. Le code de mise à jour ci-dessous utilise le mappage centré sur les attributs. Dans cet exemple, l’élément Person.Contact> se compose des attributs FirstName et LastName.< Ces attributs sont les propriétés de l’élément <Person.Contact> . Comme dans l’exemple précédent, ce code de mise à jour ne spécifie aucun schéma de mappage. Il s’appuie donc sur le mappage implicite pour mapper l’élément <Person.Contact> à la table Person.Contact et les attributs de l’élément aux colonnes respectives de la table.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
  <updg:before>  
  </updg:before>  
  <updg:after>  
    <Person.Contact FirstName="Catherine" LastName="Abel" />  
  </updg:after>  
</updg:sync>  
</ROOT>  

Utilisation du mappage centré sur les éléments et du mappage centré sur les attributs

Vous pouvez spécifier une association du mappage centré sur les éléments et du mappage centré sur les attributs, comme l'illustre le code de mise à jour ci-dessous. Notez que l’élément Person.Contact> contient à la <fois un attribut et un élément enfant. Également, ce code de mise à jour s'appuie sur un mappage implicite. Ainsi, l’attribut FirstName et l’élément< enfant LastName> sont mappés aux colonnes correspondantes dans la table Person.Contact.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
  <updg:before>  
  </updg:before>  
  <updg:after>  
    <Person.Contact FirstName="Catherine" >  
       <LastName>Abel</LastName>  
    </Person.Contact>  
  </updg:after>  
</updg:sync>  
</ROOT>  

Utilisation des caractères valides dans SQL Server mais non valides dans XML

Dans SQL Server, les noms de tables peuvent inclure un espace. Toutefois, ce type de nom de table n'est pas valide dans XML.

Pour encoder des caractères qui sont des identificateurs SQL Server valides, mais qui ne sont pas des identificateurs XML valides, utilisez « __xHHHH__ » comme valeur d’encodage, où HHHHH représente le code HEXAdécimal UCS-2 à quatre chiffres pour le caractère dans le premier ordre de bits le plus significatif. À l’aide de ce schéma d’encodage, un caractère d’espace est remplacé par x0020 (code hexadécimal à quatre chiffres pour un caractère d’espace) ; ainsi, le nom de la table [Détails de l’ordre] dans SQL Server devient _x005B_Order_x0020_Details_x005D_ en XML.

De même, vous devrez peut-être spécifier des noms d’éléments en trois parties, tels que <[base de données].[ propriétaire]. [table]>. Étant donné que les caractères de crochet ([ et ]) ne sont pas valides en XML, vous devez le spécifier comme <_x005B_database_x005D_._x005B_owner_x005D_._x005B_table_x005D_>, où _x005B_ est l’encodage du crochet gauche ([) et _x005D_ est l’encodage du crochet droit (]).

Exécution de codes de mise à jour

Comme un code de mise à jour est un modèle, tous les mécanismes de traitement d'un modèle s'appliquent aux codes de mise à jour. Pour SQLXML 4.0, vous pouvez exécuter un code de mise à jour d'une des façons suivantes :

  • En le soumettant dans une commande ADO.

  • En le soumettant sous la forme d'une commande OLE DB.

Voir aussi

Considérations de sécurité relatives au code de mise à jour (updategram) (SQLXML 4.0)