Freigeben über


sql:relationship und die Schlüsselsortierregel (SQLXML 4.0)

Da das XML-Massenladen Datensätze generiert, wenn deren Knoten in den Bereich gelangen, und diese Datensätze an Microsoft SQL Server sendet, wenn die Knoten den Bereich verlassen, müssen die Daten für den Datensatz im Bereich des Knotens vorhanden sein. 

Betrachten Sie das folgende XSD-Schema, in dem die 1:n-Beziehung zwischen den <Customer>- und <Order>-Elementen (ein Kunde kann viele Aufträge vergeben) mithilfe des <sql:relationship>-Elements angegeben werden:

<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>

Wenn der <Customer>-Elementknoten in den Bereich gelangt, generiert das XML-Massenladen einen Kundendatensatz. Dieser Datensatz bleibt, bis das XML-Massenladen </Customer> liest. Beim Verarbeiten des <Order>-Elementknotens verwendet das XML-Massenladen <sql:relationship>, um den Wert für die CustomerID-Fremdschlüsselspalte der CustOrder-Tabelle des übergeordneten <Customer>-Elements zu erhalten, da das <Order>-Element das CustomerID-Attribut angibt. Dies bedeutet, dass Sie beim Definieren des <Customer>-Elements das CustomerID-Attribut im Schema angeben müssen, bevor Sie <sql:relationship> angeben. Andernfalls generiert das XML-Massenladen, wenn ein <Order>-Element in den Bereich gelangt, einen Datensatz für die CustOrder-Tabelle, und wenn das XML-Massenladen das </Order>-Endtag erreicht, sendet es den Datensatz ohne den Wert für die CustomerID-Fremdschlüsselspalte an SQL Server.

Speichern Sie das in diesem Beispiel bereitgestellte Schema unter dem Dateinamen SampleSchema.xml.

So testen Sie ein funktionstüchtiges Beispiel

  1. Erstellen Sie die folgenden 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. Speichern Sie die folgenden Beispieldaten unter dem Dateinamen 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. Speichern Sie folgendes Microsoft Visual Basic Scripting Edition (VBScript)-Beispiel unter dem Dateinamen MySample.vbs, und führen Sie es aus, um das XML-Massenladen auszuführen:

    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
    

    Als Ergebnis fügt das XML-Massenladen einen NULL-Wert in die CustomerID-Fremdschlüsselspalte der CustOrder-Tabelle ein. Wenn Sie die XML-Beispieldaten so überarbeiten, dass das untergeordnete <CustomerID>-Element vor dem untergeordneten <Order>-Element angezeigt wird, erhalten Sie das erwartete Ergebnis: Das XML-Massenladen fügt den angegebenen Fremdschlüsselwert in die Spalte ein.

Dies ist das entsprechende 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>