Partager via


Insérer des données à l’aide de codes de mise à jour XML (SQLXML 4.0)

S’applique à :SQL ServerAzure SQL Database

Un code de mise à jour indique une opération d’insertion lorsqu’une instance d’enregistrement apparaît dans le <after> bloc, mais pas dans le bloc correspondant <before> . Dans ce cas, le code de mise à jour insère l’enregistrement dans le bloc dans la <after> base de données.

Voici le format du code de mise à jour pour une opération d'insertion :

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync [mapping-schema="SampleSchema.xml"]  >
   [<updg:before>
   </updg:before>]
    <updg:after [updg:returnid="x y ..."] >
       <ElementName [updg:id="value"]
                   [updg:at-identity="x"]
                   [updg:guid="y"]
                   attribute="value"
                   attribute="value"
                   ...
       />
      [<ElementName .../>... ]
    </updg:after>
  </updg:sync>
</ROOT>

Bloc <before>

Le <before> bloc peut être omis pour une opération d’insertion. Si l’attribut facultatif mapping-schema n’est pas spécifié, celui <ElementName> spécifié dans le code de mise à jour est mappé à une table de base de données et les éléments enfants ou attributs mappés aux colonnes de la table.

Bloc <after>

Vous pouvez spécifier un ou plusieurs enregistrements dans le <after> bloc.

Si le <after> bloc ne fournit pas de valeur pour une colonne particulière, le code de mise à jour utilise la valeur par défaut spécifiée dans le schéma annoté (si un schéma a été spécifié). Si le schéma ne spécifie pas de valeur par défaut pour la colonne, le code de mise à jour ne spécifie aucune valeur explicite à cette colonne et, à la place, affecte la valeur par défaut SQL Server (si spécifiée) à cette colonne. S’il n’existe aucune valeur par défaut SQL Server et que la colonne accepte une NULL valeur, le code de mise à jour définit la valeur NULLde colonne sur . Si la colonne n’a pas de valeur par défaut ou accepte une NULL valeur, la commande échoue et le code de mise à jour retourne une erreur. L’attribut facultatif updg:returnid est utilisé pour retourner la valeur d’identité générée par le système lorsqu’un enregistrement est ajouté dans une table avec une IDENTITYcolonne -type.

Attribut updg:id

Si le code de mise à jour insère uniquement des enregistrements, le code de mise à jour ne nécessite pas l’attribut updg:id . Pour plus d’informations sur updg:id, consultez Mise à jour des données à l’aide de codes de mise à jour XML (SQLXML 4.0).

Attribut updg:at-identity

Lorsqu’un code de mise à jour insère un enregistrement dans une table qui a une IDENTITYcolonne -type, le code de mise à jour peut capturer la valeur affectée par le système à l’aide de l’attribut facultatif updg:at-identity . Le code de mise à jour peut utiliser ensuite cette valeur dans les opérations suivantes. Lors de l’exécution du code de mise à jour, vous pouvez retourner la valeur d’identité générée en spécifiant l’attribut updg:returnid .

Attribut updg:guid

L’attribut updg:guid est un attribut facultatif qui génère un identificateur global unique. Cette valeur reste dans l’étendue du bloc entier <sync> dans lequel il est spécifié. Vous pouvez utiliser cette valeur n’importe où dans le <sync> bloc. L’attribut appelle la NEWGUID() fonction SQL Server pour générer l’identificateur unique.

Exemples

Pour créer des exemples de travail à l’aide des exemples suivants, vous devez répondre aux exigences spécifiées dans Configuration requise pour l’exécution d’exemples SQLXML.

Avant d’utiliser les exemples de code de mise à jour, envisagez les éléments suivants :

  • La plupart des exemples utilisent le mappage par défaut (en d'autres termes, aucun schéma de mappage n'est spécifié dans le code de mise à jour (updategram)). Pour plus d’exemples de codes de mise à jour qui utilisent des schémas de mappage, consultez Spécification d’un schéma de mappage annoté dans un code de mise à jour (SQLXML 4.0).

  • La plupart des exemples sont basés sur l'exemple de base de données AdventureWorks2025. Toutes les mises à jour sont appliquées aux tables de cette base de données.

R : Insérer un enregistrement à l’aide d’un code de mise à jour

Ce code de mise à jour centré sur les attributs insère un enregistrement dans la table de la HumanResources.EmployeeAdventureWorks2025 base de données.

Dans cet exemple, le code de mise à jour ne spécifie pas de schéma de mappage. Par conséquent, le code de mise à jour utilise le mappage par défaut, dans lequel le nom d'élément est mappé à un nom de table et les attributs ou éléments enfants sont mappés aux colonnes dans cette table.

Le schéma AdventureWorks2025 pour la table HumanResources.Department impose une restriction NOT NULL sur toutes les colonnes sauf OrganizationNode et OrganizationLevel. Par conséquent, le code de mise à jour doit inclure des valeurs spécifiées pour toutes les colonnes. DepartmentID est une IDENTITYcolonne de type -. Par conséquent, aucune valeur n'est spécifiée pour cette colonne.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:before>
    </updg:before>
    <updg:after>
      <HumanResources.Department Name="New Product Research" GroupName="Research and Development" ModifiedDate="2010-08-31" />
    </updg:after>
  </updg:sync>
</ROOT>

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

  1. Copiez le code de mise à jour précédent et collez-le dans un fichier texte. Enregistrez le fichier en tant que MyUpdategram.xml.

  2. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.

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

Dans un mappage centré sur l'élément, le code de mise à jour ressemble à ceci :

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:before>
    </updg:before>
    <updg:after>
      <HumanResources.Department>
        <Name> New Product Research </Name>
        <GroupName> Research and Development </GroupName>
        <ModifiedDate>2010-08-31</ModifiedDate>
      </HumanResources.Department>
    </updg:after>
  </updg:sync>
</ROOT>

Dans un code de mise à jour en mode mixte (centré sur l'élément et centré sur l'attribut), un élément peut avoir des attributs et des sous-éléments, comme indiqué dans ce code de mise à jour :

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:before>
    </updg:before>
    <updg:after>
      <HumanResources.Department Name="New Product Research">
        <GroupName>Research and Development</GroupName>
        <ModifiedDate>2010-08-31</ModifiedDate>
      </HumanResources.Department>
    </updg:after>
  </updg:sync>
</ROOT>

B. Insérer plusieurs enregistrements à l’aide d’un code de mise à jour

Ce code de mise à jour ajoute deux nouveaux enregistrements de décalage à la HumanResources.Shift table. Le code de mise à jour ne spécifie pas le bloc facultatif <before> .

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:after>
      <HumanResources.Shift Name="Day-Evening" StartTime="1900-01-01 11:00:00.000" EndTime="1900-01-01 19:00:00.000" ModifiedDate="2004-01-01 00:00:00.000" />
      <HumanResources.Shift Name="Evening-Night" StartTime="1900-01-01 19:00:00.000" EndTime="1900-01-01 03:00:00.000" ModifiedDate="2004-01-01 00:00:00.000" />
    </updg:after>
  </updg:sync>
</ROOT>

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

  1. Copiez le code de mise à jour précédent et collez-le dans un fichier texte. Enregistrez le fichier en tant que Updategram-AddShifts.xml.

  2. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.

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

Une autre version de cet exemple est un code de mise à jour qui utilise deux blocs distincts <after> au lieu d’un bloc pour insérer les deux employés. Cette opération est valide et peut être encodée comme suit :

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:after>
      <HumanResources.Shift Name="Day-Evening" StartTime="1900-01-01 11:00:00.000" EndTime="1900-01-01 19:00:00.000" ModifiedDate="2004-01-01 00:00:00.000" />
    </updg:after>
    <updg:before>
    </updg:before>
    <updg:after>
      <HumanResources.Shift Name="Evening-Night" StartTime="1900-01-01 19:00:00.000" EndTime="1900-01-01 03:00:00.000" ModifiedDate="2004-01-01 00:00:00.000" />
    </updg:after>
  </updg:sync>
</ROOT>

C. Utiliser des caractères SQL Server valides qui ne sont pas valides dans XML

Dans SQL Server, les noms de tables peuvent inclure un espace, tel que la table Order Details dans la base de données Northwind. Toutefois, cela n’est pas valide dans les caractères XML qui sont des identificateurs SQL Server valides, mais pas des identificateurs XML valides peuvent être codés _xHHHH_ en tant que valeur d’encodage, où HHHH il s’agit du code UCS-2 hexadécimal à quatre chiffres pour le caractère dans le premier ordre de bits le plus significatif.

Remarque

Cet exemple utilise l'exemple de base de données Northwind. Vous pouvez installer la base de données Northwind à l’aide d’un script SQL disponible en téléchargement à partir de ce site Web Microsoft.

En outre, le nom de l’élément doit être placé entre crochets ([ ]). Étant donné que les caractères [et] ne sont pas valides en XML, vous devez les encoder en tant que _x005B_ et _x005D_, respectivement. (Si vous utilisez un schéma de mappage, vous pouvez fournir des noms d’éléments qui ne contiennent pas de caractères non valides, tels que des espaces blancs. Le schéma de mappage effectue le mappage nécessaire ; par conséquent, vous n’avez pas besoin d’encoder pour ces caractères).

Ce code de mise à jour ajoute un enregistrement à la table Order Details dans la base de données Northwind :

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:before>
    </updg:before>
    <updg:after>
      <_x005B_Order_x0020_Details_x005D_ OrderID="1" ProductID="11" UnitPrice="$1.0" Quantity="1" Discount="0.0" />
    </updg:after>
  </updg:sync>
</ROOT>

La colonne UnitPrice de la table Détails de la commande est du type argent . Pour appliquer la conversion de type appropriée (d’un type de chaîne à un type money ), le caractère de signe dollar ($) doit être ajouté dans le cadre de la valeur. Si le code de mise à jour ne spécifie pas de schéma de mappage, le premier caractère de la valeur de chaîne est évalué. Si le premier caractère est le signe $, la conversion appropriée est appliquée.

Si le code de mise à jour est spécifié par rapport à un schéma de mappage où la colonne est correctement marquée comme dt:type="fixed.14.4" étant l’une ou sql:datatype="money"l’autre, le signe dollar ($) n’est pas obligatoire et la conversion est gérée par le mappage. Il s'agit de la méthode recommandée pour garantir que la conversion de type appropriée a lieu.

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

  1. Copiez le code de mise à jour précédent et collez-le dans un fichier texte. Enregistrez le fichier en tant que UpdategramSpacesInTableName.xml.

  2. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.

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

D. Utilisez l’attribut at-identity pour récupérer la valeur qui a été insérée dans la colonne IDENTITY-type

Le code de mise à jour suivant insère deux enregistrements : un dans la Sales.SalesOrderHeader table et un autre dans la Sales.SalesOrderDetail table.

Tout d’abord, le code de mise à jour ajoute un enregistrement à la Sales.SalesOrderHeader table. Dans ce tableau, la colonne SalesOrderID est une IDENTITYcolonne -type. Par conséquent, lorsque vous ajoutez cet enregistrement à la table, le code de mise à jour utilise l’attribut at-identity pour capturer la valeur SalesOrderID affectée en tant que « x » (valeur d’espace réservé). Le code Updategram spécifie ensuite cette at-identity variable comme valeur de l’attribut SalesOrderID dans l’élément <Sales.SalesOrderDetail> .

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:before>
    </updg:before>
    <updg:after>
      <Sales.SalesOrderHeader updg:at-identity="x" RevisionNumber="1" OrderDate="2001-07-01 00:00:00.000" DueDate="2001-07-13 00:00:00.000" OnlineOrderFlag="0" CustomerID="676" ContactID="378" BillToAddressID="985" ShipToAddressID="985" ShipMethodID="5" SubTotal="24643.9362" TaxAmt="1971.5149" Freight="616.0984" rowguid="00001111-2222-3333-4444-556677889900" ModifiedDate="2001-07-08 00:00:00.000" />
      <Sales.SalesOrderDetail SalesOrderID="x" LineNumber="1" OrderQty="1" ProductID="776" SpecialOfferID="1" UnitPrice="2429.9928" UnitPriceDiscount="0.00" rowguid="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" ModifiedDate="2001-07-01 00:00:00.000" />
    </updg:after>
  </updg:sync>
</ROOT>

Si vous souhaitez retourner la valeur d’identité générée par l’attribut updg:at-identity , vous pouvez utiliser l’attribut updg:returnid . L’exemple suivant est un code de mise à jour révisé qui retourne cette valeur d’identité. (Ce code de mise à jour ajoute deux enregistrements de commande et deux enregistrements de détail de commande pour rendre l'exemple un peu plus complexe.)

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:before>
    </updg:before>
    <updg:after updg:returnid="x y">
      <HumanResources.Shift updg:at-identity="x" Name="Day-Evening" StartTime="1900-01-01 11:00:00.000" EndTime="1900-01-01 19:00:00.000" ModifiedDate="2004-01-01 00:00:00.000" />
      <HumanResources.Shift updg:at-identity="y" Name="Evening-Night" StartTime="1900-01-01 19:00:00.000" EndTime="1900-01-01 03:00:00.000" ModifiedDate="2004-01-01 00:00:00.000" />
    </updg:after>
  </updg:sync>
</ROOT>

Lorsque le code de mise à jour est exécuté, il retourne des résultats similaires à l’exemple suivant, qui inclut la valeur d’identité (la valeur générée de la colonne ShiftID utilisée pour l’identité de table) qui a été générée :

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <returnid>
    <x>4</x>
    <y>5</y>
  </returnid>
</ROOT>

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

  1. Copiez le code de mise à jour précédent et collez-le dans un fichier texte. Enregistrez le fichier en tant que Updategram-returnId.xml.

  2. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.

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

E. Utiliser l’attribut updg:guid pour générer une valeur unique

Dans cet exemple, le code de mise à jour insère un enregistrement dans les tables Cust et CustOrder. En outre, le code de mise à jour génère une valeur unique pour l’attribut CustomerID à l’aide de l’attribut updg:guid .

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync>
    <updg:before>
    </updg:before>
    <updg:after updg:returnid="x">
      <Cust updg:guid="x">
        <CustID>x</CustID>
        <LastName>Fuller</LastName>
      </Cust>
      <CustOrder>
        <CustID>x</CustID>
        <OrderID>1</OrderID>
      </CustOrder>
    </updg:after>
  </updg:sync>
</ROOT>

Le code de mise à jour spécifie l’attribut returnid . En conséquence, le GUID généré est retourné :

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <returnid>
    <x>7111BD1A-7F0B-4CEE-B411-260DADFEFA2A</x>
  </returnid>
</ROOT>

Tester le code de mise à jour

  1. Copiez le code de mise à jour précédent et collez-le dans un fichier texte. Enregistrez le fichier en tant que Updategram-GenerateGuid.xml.

  2. Créez les tables suivantes :

    USE tempdb;
    
    CREATE TABLE Cust
    (
        CustID UNIQUEIDENTIFIER,
        LastName VARCHAR (20)
    );
    
    CREATE TABLE CustOrder
    (
        CustID UNIQUEIDENTIFIER,
        OrderID INT
    );
    
  3. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.

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

F. Spécifier un schéma dans un code de mise à jour

Le code de mise à jour dans cet exemple insère un enregistrement dans la table suivante :

CustOrder(OrderID, EmployeeID, OrderType)

Un schéma XSD est spécifié dans ce code de mise à jour (autrement dit, il n’existe aucun mappage par défaut d’éléments et d’attributs updategram). Le schéma fournit le mappage nécessaire des éléments et des attributs aux tables et aux colonnes de base de données.

Le schéma suivant (CustOrderSchema.xml) décrit un <CustOrder> élément constitué des attributs et OrderID des EmployeeID attributs. Pour rendre le schéma plus intéressant, une valeur par défaut est affectée à l’attribut EmployeeID . Un code de mise à jour utilise la valeur par défaut d’un attribut uniquement pour les opérations d’insertion, puis uniquement si le code de mise à jour ne spécifie pas cet attribut.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:element name="CustOrder">
    <xsd:complexType>
      <xsd:attribute name="OrderID" type="xsd:integer" />
      <xsd:attribute name="EmployeeID" type="xsd:integer" />
      <xsd:attribute name="OrderType  " type="xsd:integer" default="1" />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Ce code de mise à jour insère un enregistrement dans la table CustOrder. Le code de mise à jour spécifie uniquement les valeurs des attributs OrderID et EmployeeID. Elle ne spécifie pas la valeur de l’attribut OrderType. Par conséquent, le code de mise à jour utilise la valeur par défaut de l'attribut EmployeeID spécifié dans le schéma précédent.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync mapping-schema="CustOrderSchema.xml">
    <updg:after>
      <CustOrder OrderID="98000" EmployeeID="1" />
    </updg:after>
  </updg:sync>
</ROOT>

Pour obtenir d’autres exemples de codes de mise à jour qui spécifient un schéma de mappage, consultez Spécification d’un schéma de mappage annoté dans un code de mise à jour (SQLXML 4.0).

Tester le code de mise à jour

  1. Créez cette table dans la tempdb base de données :

    USE tempdb;
    
    CREATE TABLE CustOrder
    (
        OrderID INT,
        EmployeeID INT,
        OrderType INT
    );
    
  2. Copiez le schéma précédent et collez-le dans un fichier texte. Enregistrez le fichier en tant que CustOrderSchema.xml.

  3. Copiez le code de mise à jour précédent et collez-le dans un fichier texte. Enregistrez le fichier comme CustOrderUpdategram.xml dans le même dossier utilisé à l’étape précédente.

  4. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le code de mise à jour.

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

Voici le schéma XDR équivalent :

<Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <ElementType name="CustOrder">
    <AttributeType name="OrderID" />
    <AttributeType name="EmployeeID" />
    <AttributeType name="OrderType" default="1" />
    <attribute type="OrderID" />
    <attribute type="EmployeeID" />
    <attribute type="OrderType" />
  </ElementType>
</Schema>

G. Utilisez l’attribut xsi :nil pour insérer des valeurs Null dans une colonne

Si vous souhaitez insérer une valeur Null dans la colonne correspondante de la table, vous pouvez spécifier l’attribut xsi:nil sur un élément dans un code de mise à jour. Dans le schéma XSD correspondant, l’attribut XSD nillable doit également être spécifié.

Considérons par exemple ce schéma XSD :

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:element name="Student" sql:relation="Students">
    <xsd:complexType>
      <xsd:all>
        <xsd:element name="fname" sql:field="first_name" type="xsd:string" nillable="true" />
      </xsd:all>
      <xsd:attribute name="SID" sql:field="StudentID" type="xsd:ID" />
      <xsd:attribute name="lname" sql:field="last_name" type="xsd:string" />
      <xsd:attribute name="minitial" sql:field="middle_initial" type="xsd:string" />
      <xsd:attribute name="years" sql:field="no_of_years" type="xsd:integer" />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Le schéma XSD spécifie nillable="true" l’élément <fname> . Le code de mise à jour suivant utilise ce schéma :

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" xmlns:updg="urn:schemas-microsoft-com:xml-updategram" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <updg:sync mapping-schema="StudentSchema.xml">
    <updg:before />
    <updg:after>
      <Student SID="S00004" lname="Elmaci" minitial="" years="2">
        <fname xsi:nil="true">
        </fname>
      </Student>
    </updg:after>
  </updg:sync>
</ROOT>

Le code de mise à jour spécifie xsi:nil l’élément <fname> dans le <after> bloc. Par conséquent, lorsque ce code de mise à jour est exécuté, une valeur de NULL celle-ci est insérée pour la colonne first_name dans la table.

Tester le code de mise à jour

  1. Créez le tableau suivant dans la tempdb base de données :

    USE tempdb;
    
    CREATE TABLE Students
    (
        StudentID CHAR (6) NOT NULL,
        first_name VARCHAR (50),
        last_name VARCHAR (50),
        middle_initial CHAR (1),
        no_of_years INT NULL
    );
    GO
    
  2. Copiez le schéma précédent et collez-le dans un fichier texte. Enregistrez le fichier en tant que StudentSchema.xml.

  3. Copiez le code de mise à jour précédent et collez-le dans un fichier texte. Enregistrez le fichier comme StudentUpdategram.xml dans le même dossier utilisé à l’étape précédente pour enregistrer StudentSchema.xml.

  4. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le code de mise à jour.

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

H. Spécifier des espaces de noms dans un code de mise à jour

Dans un code de mise à jour, vous pouvez avoir des éléments qui appartiennent à un espace de noms déclaré dans le même élément dans le code de mise à jour. Dans ce cas, le schéma correspondant doit également déclarer le même espace de noms et l'élément doit appartenir à cet espace de noms cible.

Par exemple, dans le code de mise à jour suivant (UpdateGram-ElementHavingNamespace.xml), l’élément <Order> appartient à un espace de noms déclaré dans l’élément.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync mapping-schema="XSD-ElementHavingNameSpace.xml">
    <updg:after>
      <x:Order xmlns:x="https://server/xyz/schemas/" updg:at-identity="SalesOrderID" RevisionNumber="1" OrderDate="2001-07-01 00:00:00.000" DueDate="2001-07-13 00:00:00.000" OnlineOrderFlag="0" CustomerID="676" ContactID="378" BillToAddressID="985" ShipToAddressID="985" ShipMethodID="5" SubTotal="24643.9362" TaxAmt="1971.5149" Freight="616.0984" rowguid="00009999-8888-7777-6666-554433221100" ModifiedDate="2001-07-08 00:00:00.000" />
    </updg:after>
  </updg:sync>
</ROOT>

Dans ce cas, le schéma doit également déclarer l'espace de noms comme montré dans ce schéma :

Le schéma suivant (XSD-ElementHavingNamespace.xml) montre comment l’élément et les attributs correspondants doivent être déclarés.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dt="urn:schemas-microsoft-com:datatypes" xmlns:sql="urn:schemas-microsoft-com:mapping-schema" xmlns:x="https://server/xyz/schemas/" targetNamespace="https://server/xyz/schemas/">
  <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader" type="x:Order_type" />
  <xsd:complexType name="Order_type">
    <xsd:attribute name="SalesOrderID" type="xsd:ID" />
    <xsd:attribute name="RevisionNumber" type="xsd:unsignedByte" />
    <xsd:attribute name="OrderDate" type="xsd:dateTime" />
    <xsd:attribute name="DueDate" type="xsd:dateTime" />
    <xsd:attribute name="ShipDate" type="xsd:dateTime" />
    <xsd:attribute name="Status" type="xsd:unsignedByte" />
    <xsd:attribute name="OnlineOrderFlag" type="xsd:boolean" />
    <xsd:attribute name="SalesOrderNumber" type="xsd:string" />
    <xsd:attribute name="PurchaseOrderNumber" type="xsd:string" />
    <xsd:attribute name="AccountNumber" type="xsd:string" />
    <xsd:attribute name="CustomerID" type="xsd:int" />
    <xsd:attribute name="ContactID" type="xsd:int" />
    <xsd:attribute name="SalesPersonID" type="xsd:int" />
    <xsd:attribute name="TerritoryID" type="xsd:int" />
    <xsd:attribute name="BillToAddressID" type="xsd:int" />
    <xsd:attribute name="ShipToAddressID" type="xsd:int" />
    <xsd:attribute name="ShipMethodID" type="xsd:int" />
    <xsd:attribute name="CreditCardID" type="xsd:int" />
    <xsd:attribute name="CreditCardApprovalCode" type="xsd:string" />
    <xsd:attribute name="CurrencyRateID" type="xsd:int" />
    <xsd:attribute name="SubTotal" type="xsd:decimal" />
    <xsd:attribute name="TaxAmt" type="xsd:decimal" />
    <xsd:attribute name="Freight" type="xsd:decimal" />
    <xsd:attribute name="TotalDue" type="xsd:decimal" />
    <xsd:attribute name="Comment" type="xsd:string" />
    <xsd:attribute name="rowguid" type="xsd:string" />
    <xsd:attribute name="ModifiedDate" type="xsd:dateTime" />
  </xsd:complexType>
</xsd:schema>

Tester le code de mise à jour

  1. Copiez le schéma précédent et collez-le dans un fichier texte. Enregistrez le fichier en tant que XSD-ElementHavingNamespace.xml.

  2. Copiez le code de mise à jour précédent et collez-le dans un fichier texte. Enregistrez le fichier comme Updategram-ElementHavingNamespace.xml dans le même dossier que celui utilisé pour enregistrer XSD-ElementHavingnamespace.xml.

  3. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le code de mise à jour.

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

I. Insérer des données dans une colonne de type de données XML

Vous pouvez utiliser des codes de mise à jour pour insérer et mettre à jour des données stockées dans des colonnes de type de données xml avec les considérations suivantes :

  • La colonne xml ne peut pas être utilisée pour identifier une ligne existante. Par conséquent, elle ne peut pas être incluse dans la updg:before section d’un code de mise à jour.

  • Les espaces de noms qui sont dans l’étendue du fragment XML inséré dans la colonne xml sont conservés et leurs déclarations d’espace de noms sont ajoutées à l’élément supérieur du fragment inséré.

Par exemple, dans le code de mise à jour suivant (SampleUpdateGram.xml), l’élément <Desc> met à jour la colonne ProductDescription dans la table ProductModel de production>dans l’exemple AdventureWorks2025 de base de données. Le résultat de ce code de mise à jour est que le contenu XML de la colonne ProductDescription est mis à jour avec le contenu XML de l’élément <Desc> .

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync mapping-schema="SampleSchema.xml">
    <updg:before>
      <ProductModel ProductModelID="19">
        <Name>Mountain-100</Name>
      </ProductModel>
    </updg:before>
    <updg:after>
      <ProductModel>
        <Name>Mountain-100</Name>
        <Desc>
          <?xml href="ProductDescription.xsl" type="text/xsl" e="text/xsl"?>
          <p1:ProductDescription xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription" xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain" xmlns:wf="https://www.adventure-works.com/schemas/OtherFeatures" xmlns:html="http://www.w3.org/1999/xhtml" xmlns="">
            <p1:Summary>
            <html:p>Insert Example</html:p>
            </p1:Summary>
            <p1:Manufacturer>
            <p1:Name>AdventureWorks</p1:Name>
            <p1:Copyright>2002</p1:Copyright>
            <p1:ProductURL>HTTP://www.Adventure-works.com</p1:ProductURL>
            </p1:Manufacturer>
            <p1:Features>
            These are the product highlights.
            <wm:Warranty>
              <wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>
              <wm:Description>parts and labor</wm:Description>
            </wm:Warranty>
            <wm:Maintenance>
              <wm:NoOfYears>10 years</wm:NoOfYears>
              <wm:Description>maintenance contract available through your dealer or any AdventureWorks retail store.</wm:Description>
            </wm:Maintenance>
            <wf:wheel>High performance wheels.</wf:wheel>
            <wf:saddle>
              <html:i>Anatomic design</html:i>
              and made from durable leather for a full-day of riding in comfort.
            </wf:saddle>
            <wf:pedal>
              <html:b>Top-of-the-line</html:b>
              clipless pedals with adjustable tension.
            </wf:pedal>
            <wf:BikeFrame>Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.</wf:BikeFrame>
            <wf:crankset> Triple crankset; aluminum crank arm; flawless shifting. </wf:crankset>
            </p1:Features>
            <p1:Picture>
            <p1:Angle>front</p1:Angle>
            <p1:Size>small</p1:Size>
            <p1:ProductPhotoID>118</p1:ProductPhotoID>
            </p1:Picture>
            <p1:Specifications>
            These are the product specifications.
            <Material>Aluminum Alloy</Material>
            <Color>Available in most colors</Color>
            <ProductLine>Mountain bike</ProductLine>
            <Style>Unisex</Style>
            <RiderExperience>Advanced to Professional riders</RiderExperience>
            </p1:Specifications>
          </p1:ProductDescription>
        </Desc>
      </ProductModel>
    </updg:after>
  </updg:sync>
</ROOT>

Le code de mise à jour fait référence au schéma XSD annoté suivant (SampleSchema.xml).

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
  <xsd:element name="ProductModel" sql:relation="Production.ProductModel">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Name" type="xsd:string"></xsd:element>
        <xsd:element name="Desc" sql:field="CatalogDescription" sql:datatype="xml">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="ProductDescription">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="Summary" type="xsd:anyType">
                    </xsd:element>
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
      <xsd:attribute name="ProductModelID" sql:field="ProductModelID" />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
Tester le code de mise à jour
  1. Copiez le schéma précédent et collez-le dans un fichier texte. Enregistrez le fichier en tant que XSD-SampleSchema.xml.

    Remarque

    Étant donné que les codes de mise à jour prennent en charge le mappage par défaut, il n’existe aucun moyen d’identifier le début et la fin du type de données xml . Cela signifie efficacement qu’un schéma de mappage est requis lors de l’insertion ou de la mise à jour de tables avec des colonnes de type de données xml . Lorsqu’un schéma n’est pas fourni, SQLXML retourne une erreur indiquant qu’une des colonnes est manquante dans la table.

  2. Copiez le code de mise à jour précédent et collez-le dans un fichier texte. Enregistrez le fichier comme SampleUpdategram.xml dans le même dossier que celui utilisé pour enregistrer SampleSchema.xml.

  3. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le code de mise à jour.

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