Share via


sql:mapped (SQLXML 4.0)

Le chargement en masse XML traite l'annotation sql:mapped du schéma XSD comme prévu : autrement dit, si le schéma de mappage spécifie sql:mapped="false" pour un élément ou un attribut, le chargement en masse XML ne tente pas de stocker les données associées dans la colonne correspondante.

Le chargement en masse XML ignore les éléments et les attributs qui ne sont pas mappés (soit parce qu'ils ne sont pas décrits dans le schéma, soit parce qu'ils sont annotés dans le schéma XSD avec sql:mapped="false"). Toutes les données non mappées vont dans la colonne de dépassement de capacité, si une telle colonne est spécifiée à l'aide de sql:overflow-field.

Considérons par exemple ce schéma XSD :

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="ROOT" sql:is-constant="1">
<xsd:complexType>
<xsd:sequence>
  <xsd:element name="Customers" sql:relation="Cust"
                                sql:overflow-field="OverflowColumn" >
   <xsd:complexType>
       <xsd:attribute name="CustomerID"  type="xsd:integer" />
       <xsd:attribute name="CompanyName" type="xsd:string" />
       <xsd:attribute name="City"        type="xsd:string" />
       <xsd:attribute name="HomePhone"   type="xsd:string" 
                                       sql:mapped="false" />
    </xsd:complexType>
  </xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

Comme l'attribut HomePhone spécifie sql:mapped="false", le chargement en masse XML ne mappe pas cet attribut à la colonne correspondante. Le schéma XSD identifie une colonne de dépassement (OverflowColumn) dans laquelle le chargement en masse XML stocke les données non consommées.

Pour tester un exemple fonctionnel

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

    USE tempdb
    CREATE TABLE Cust
              (CustomerID     int         PRIMARY KEY,
               CompanyName    varchar(20) NOT NULL,
               City           varchar(20) DEFAULT 'Seattle',
               OverflowColumn nvarchar(200))
    GO
    
  2. Enregistrez le schéma fourni dans cet exemple sous le nom SampleSchema.xml.

  3. Enregistrez l'exemple de données XML ci-après sous le nom SampleXMLData.xml :

    <ROOT>
      <Customers CustomerID="1111" CompanyName="Sean Chai" 
                 City="NY" HomePhone="111-1111" />
      <Customers CustomerID="1112" CompanyName="Dont Know" 
                 City="LA" HomePhone="222-2222" />
    </ROOT>
    
  4. Pour exécuter le chargement en masse XML, enregistrez cet exemple Microsoft Visual Basic Scripting Edition (VBScript) sous le nom Sample.vbs et exécutez-le :

    set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0")
    objBL.ConnectionString = "provider=SQLOLEDB;data source=localhost;database=tempdb;integrated security=SSPI"
    objBL.ErrorLogFile = "c:\error.log"
    objBL.CheckConstraints=True
    objBL.Execute "c:\SampleSchema.xml", "c:\SampleXMLData.xml"
    set objBL=Nothing
    

Voici le schéma XDR équivalent :

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data" 
        xmlns:sql="urn:schemas-microsoft-com:xml-sql" > 
   <ElementType name="ROOT" sql:is-constant="1">
      <element type="Customers" />
   </ElementType>
   <ElementType name="Customers" sql:relation="Cust"
                             sql:overflow-field="OverflowColumn" >
      <AttributeType name="CustomerID" />
      <AttributeType name="CompanyName"  />
      <AttributeType name="City"  />
      <AttributeType name="HomePhone" />
      <attribute type="CustomerID"  />
      <attribute type="CompanyName"  />
      <attribute type="City" />
      <attribute type="HomePhone" sql:map-field="0" />
   </ElementType>
</Schema>