Freigeben über


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

Da XML Bulk Load Datensätze generiert, während ihre Knoten in den Bereich eingegeben werden und diese Datensätze als Knotenausgangsbereich an Microsoft SQL Server senden, müssen die Daten für den Datensatz innerhalb des Bereichs des Knotens vorhanden sein.

Berücksichtigen Sie das folgende XSD-Schema, in dem die 1:n-Beziehung zwischen <Kunden> - und <Order-Elementen> (ein Kunde kann viele Bestellungen aufgeben) mithilfe des <sql:relationship> Elements angegeben wird:

<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 Knoten " <Customer> "-Element in den Bereich wechselt, generiert XML Bulk Load einen Kundendatensatz. Dieser Datensatz bleibt bis zum Lesen des XML-Massenladevorgangs </Customer>. Bei der Verarbeitung des <Order-Elementknotens> verwendet <sql:relationship> XML Bulk Load, um den Wert der Fremdschlüsselspalte "CustomerID" der CustOrder-Tabelle aus dem <übergeordneten Element "Customer>" abzurufen, da das Order-Element> nicht das<CustomerID-Attribut angibt. Dies bedeutet, dass Sie beim Definieren des <Customer-Elements> das CustomerID-Attribut im Schema angeben müssen, bevor Sie angeben <sql:relationship>. Andernfalls generiert xml Bulk Load einen <> Datensatz für die CustOrder-Tabelle, und wenn die XML-Massenlast das <Endtag "/Order>" erreicht, sendet es den Datensatz ohne den Fremdschlüsselwert CustomerID an SQL Server.

Speichern Sie das schema, das in diesem Beispiel bereitgestellt wird, als SampleSchema.xml.

So testen Sie ein Arbeitsbeispiel

  1. Erstellen Sie diese 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 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. Zum Ausführen des XML-Massenladevorgangs speichern und ausführen Sie das folgende Beispiel für Microsoft Visual Basic Scripting Edition (VBScript) 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  
    

    Das Ergebnis ist, dass die XML-Massenlast einen NULL-Wert in die Fremdschlüsselspalte "CustomerID" der CustOrder-Tabelle einfügt. Wenn Sie die XML-Beispieldaten so überarbeiten, dass das untergeordnete CustomerID-Element> vor dem<<untergeordneten Element Order> angezeigt wird, erhalten Sie das erwartete Ergebnis: XML-Massenladevorgang 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>