Delen via


Annotatie-interpretatie - sql:relationship en Key Ordering Rule

Van toepassing op:SQL ServerAzure SQL Database

Omdat XML Bulk Load records genereert zodra hun nodes in scope komen en die records naar Microsoft SQL Server stuurt als hun nodes de scope verlaat, moeten de gegevens voor het record binnen de scope van de node aanwezig zijn.

Beschouw het volgende XSD-schema, waarin de één-op-veel-relatie tussen <Klant> - en <Order-elementen> (één klant kan veel bestellingen plaatsen) wordt gespecificeerd door gebruik te maken van het <sql:relationship-element> :

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"<>   
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
<xsd:annotation>  
  <xsd:appinfo>  
    <sql:relationship name="CustCustOrder"  
          parent="Cust"  
          parent-key="CustomerID"  
          child="CustOrder"  
          child-key="CustomerID" />  
  </xsd:appinfo>  
</xsd:annotation>  
  
  <xsd:element name="Customers" sql:relation="Cust" >  
   <xsd:complexType>  
     <xsd:sequence>  
       <xsd:element name="CustomerID"  type="xsd:integer" />  
       <xsd:element name="CompanyName" type="xsd:string" />  
       <xsd:element name="City"        type="xsd:string" />  
       <xsd:element name="Order"   
                          sql:relation="CustOrder"  
                          sql:relationship="CustCustOrder" >  
         <xsd:complexType>  
          <xsd:attribute name="OrderID" type="xsd:integer" />  
         </xsd:complexType>  
       </xsd:element>  
     </xsd:sequence>  
    </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  

Wanneer de <Customer> Element-node in scope komt, genereert XML Bulk Load een klantrecord. Dit record blijft staan totdat XML Bulk Load /Customer> leest<. Bij het verwerken van de <Order-elementknoop> gebruikt <XML Bulk Load sql:relationship> om de waarde van de CustomerID-vreemde sleutelkolom van de CustOrder-tabel uit het <Customer-ouderelement> te verkrijgen, omdat het <Order-element> het CustomerID-attribuut niet specificeert. Dit betekent dat je bij het definiëren van het <Customer-element> eerst het CustomerID-attribuut in het schema moet specificeren voordat je sql:relationship> specificeert<. Anders, wanneer een <Order-element> in scope komt, genereert XML Bulk Load een record voor de CustOrder-tabel, en wanneer de XML Bulk Load de </Order> end-tag bereikt, wordt het record naar SQL Server gestuurd zonder de kolom CustomerID vreemde sleutel.

Sla het schema dat in dit voorbeeld wordt gegeven op als SampleSchema.xml.

Om een werkmonster te testen

  1. Maak deze tabellen:

    CREATE TABLE Cust (  
                  CustomerID     int          PRIMARY KEY,  
               CompanyName    varchar(20)  NOT NULL,  
                  City           varchar(20)  DEFAULT 'Seattle')  
    GO  
    CREATE TABLE CustOrder (  
                  OrderID        varchar(10) PRIMARY KEY,  
               CustomerID     int         FOREIGN KEY REFERENCES                                          Cust(CustomerID))  
    GO  
    
  2. Sla de volgende voorbeeldgegevens op als SampleXMLData.xml:

    <ROOT>    
      <Customers>  
        <CompanyName>Hanari Carnes</CompanyName>  
        <City>NY</City>  
        <Order OrderID="1" />  
        <Order OrderID="2" />  
        <CustomerID>1111</CustomerID>  
      </Customers>  
      <Customers>  
        <CompanyName>Toms Spezialitten</CompanyName>  
         <City>LA</City>    
        <Order OrderID="3" />  
        <CustomerID>1112</CustomerID>  
      </Customers>  
      <Customers>  
        <CompanyName>Victuailles en stock</CompanyName>  
        <Order OrderID="4" />  
        <CustomerID>1113</CustomerID>  
      </Customers>  
    </ROOT>  
    
  3. Om XML Bulk Load uit te voeren, sla en voer je het volgende voorbeeld van Microsoft Visual Basic Scripting Edition (VBScript) uit als MySample.vbs:

    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.Transaction=True  
    objBL.Execute "c:\SampleSchema.xml", "c:\SampleXMLData.xml"  
    set objBL=Nothing  
    

    Het resultaat is dat XML Bulk Load een NULL-waarde invoegt in de CustomerID-kolom vreemde sleutel van de CustOrder-tabel. Als je de XML-voorbeeldgegevens zo aanpast dat het <CustomerID-kindelement> vóór het <Order-kindelement> verschijnt, krijg je het verwachte resultaat: XML Bulk Load voegt de gespecificeerde vreemde sleutelwaarde in de kolom in.

Dit is het equivalente XDR-schema:

<?xml version="1.0" ?>  
<Schema xmlns="urn:schemas-microsoft-com:xml-data"   
        xmlns:dt="urn:schemas-microsoft-com:xml:datatypes"    
        xmlns:sql="urn:schemas-microsoft-com:xml-sql" >   
   <ElementType name="CustomerID"  />  
   <ElementType name="CompanyName" />  
   <ElementType name="City"        />  
  
   <ElementType name="root" sql:is-constant="1">  
      <element type="Customers" />  
   </ElementType>  
  
   <ElementType name="Customers" sql:relation="Cust" >  
      <element type="CustomerID" sql:field="CustomerID" />  
      <element type="CompanyName" sql:field="CompanyName" />  
      <element type="City" sql:field="City" />  
      <element type="Order" >  
                 <sql:relationship  
                        key-relation    ="Cust"  
                        key             ="CustomerID"  
                        foreign-key     ="CustomerID"  
                        foreign-relation="CustOrder" />  
      </element>  
   </ElementType>  
    <ElementType name="Order" sql:relation="CustOrder" >  
      <AttributeType name="OrderID" />  
      <AttributeType name="CustomerID" />  
      <attribute type="OrderID" />  
      <attribute type="CustomerID" />  
    </ElementType>  
</Schema>