Freigeben über


Datensatzgenerierungsprozess (SQLXML 4.0)

Gilt für: SQL Server Azure SQL-Datenbank

XML-Massenladevorgang verarbeitet die XML-Eingabedaten und bereitet Datensätze für die entsprechenden Tabellen in Microsoft SQL Server vor. Die Logik im XML-Massenladevorgang bestimmt, wann ein neuer Datensatz generiert werden soll, welche untergeordneten Element- oder Attributwerte in die Felder des Datensatzes kopiert werden sollen, und wann der Datensatz abgeschlossen ist und bereit ist, zum Einfügen an SQL Server zu senden.

Xml-Massenladevorgang lädt nicht die gesamten XML-Eingabedaten in den Arbeitsspeicher und erzeugt keine vollständigen Datensatzsätze, bevor Daten an SQL Server gesendet werden. Dies liegt daran, dass XML-Eingabedaten sehr große Dokumente bilden können und das Laden des gesamten Dokuments in den Speicher kostspielig sein kann. Stattdessen wird beim XML-Massenladen wie folgt vorgegangen:

  1. Analysieren des Zuordnungsschemas und Vorbereiten des notwendigen Ausführungsplans.

  2. Anwenden des Ausführungsplans auf die Daten im Eingabedatenstrom.

Aufgrund dieser sequenziellen Verarbeitung müssen die XML-Eingabedaten auf eine bestimmte Weise bereitgestellt werden. Es ist wichtig, zu verstehen, wie das Zuordnungsschema beim XML-Massenladen analysiert wird und wie der Datensatzgenerierungsprozess abläuft. Mit diesem Wissen können Sie ein Zuordnungsschema für XML-Massenladen bereitstellen, das die gewünschten Ergebnisse liefert.

Beim XML-Massenladen werden gängige Anmerkungen im Zuordnungsschema verarbeitet, darunter Spalten- und Tabellenzuordnungen (die explizit über Anmerkungen oder implizit über die Standardzuordnung angegeben werden), sowie Joinbeziehungen.

Hinweis

Es wird davon ausgegangen, dass Sie mit XSD- oder XDR-Zuordnungsschemas mit Anmerkungen vertraut sind. Weitere Informationen zu Schemas finden Sie in der Einführung in kommentierte XSD-Schemas (SQLXML 4.0) oder kommentierte XDR-Schemas (veraltet in SQLXML 4.0).

Grundlage für das Verständnis der Datensatzgenerierung sind folgende Konzepte:

  • Bereich eines Knotens

  • Datensatzgenerierungsregel

  • Datensatzteilmenge und Schlüsselsortierregel

  • Ausnahmen von der Datensatzgenerierungsregel

Bereich eines Knotens

Ein Knoten (ein Element oder ein Attribut) in einem XML-Dokument wechselt in den Bereich , wenn das XML-Massenladevorgang im XML-Eingabedatenstrom auftritt. Bei Elementknoten bringt das Starttag des Elements das Element in den Bereich. Bei Attributknoten bringt der Attributname das Attribut in den Bereich.

Ein Knoten verlässt den Bereich, wenn keine Daten mehr dafür vorliegen, das heißt entweder am Endtag (im Fall eines Elementknotens) oder am Ende eines Attributwerts (im Fall eines Attributknotens).

Datensatzgenerierungsregel

Gelangt ein (Element- oder Attribut-) Knoten in den Bereich, kann daraus ein Datensatz generiert werden. Der Datensatz besteht weiter, solange der zugeordnete Knoten im Bereich ist. Wenn der Knoten den Gültigkeitsbereich überschreitet, berücksichtigt XML Bulk Load den generierten Datensatz vollständig (mit Daten) und sendet ihn zur Einfügung an SQL Server.

Betrachten Sie beispielsweise das folgende XSD-Schemafragment:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
  <xsd:element name="Customer" sql:relation="Customers" >  
   <xsd:complexType>  
     <xsd:attribute name="CustomerID" type="xsd:string" />  
     <xsd:attribute name="CompanyName" type="xsd:string" />  
    </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  

Das Schema gibt ein <Customer-Element> mit CustomerID- und CompanyName-Attributen an. Die sql:relation-Anmerkung ordnet das <Customer-Element> der Tabelle "Customers" zu.

Betrachten Sie dieses Fragment eines XML-Dokuments:

<Customer CustomerID="1" CompanyName="xyz" />  
<Customer CustomerID="2" CompanyName="abc" />  
...  

Wenn für das XML-Massenladen das in den vorstehenden Absätzen erläuterte Schema und XML-Daten als Eingabe bereitgestellt werden, werden die (Element- und Attribut-) Knoten in den Quelldaten wie folgt verarbeitet:

  • Das Starttag des ersten <Customer-Elements> bringt dieses Element in den Bereich. Dieser Knoten ist der Customers-Tabelle zugeordnet. Beim XML-Massenladen wird daher ein Datensatz für die Customers-Tabelle generiert.

  • Im Schema sind alle Attribute des <Customer-Elements> spalten der Tabelle "Customers" zugeordnet. Wenn diese Attribute in den Bereich gelangen, werden ihre Werte in den Kundendatensatz kopiert, der bereits vom übergeordneten Bereich generiert wurde.

  • Wenn die XML-Massenlast das Endtag für das <Customer-Element> erreicht, geht das Element außerhalb des Gültigkeitsbereichs. Dies führt dazu, dass xml-Massenladevorgang den Vollständigen Datensatz berücksichtigt und an SQL Server gesendet wird.

XML-Massenladevorgang folgt diesem Prozess für jedes nachfolgende Customer-Element>.<

Wichtig

Da in diesem Modell ein Datensatz eingefügt wird, wenn das Endtag erreicht ist (oder der Knoten den Bereich verlässt), müssen Sie alle mit dem Datensatz verknüpften Daten innerhalb des Knotenbereichs definieren.

Datensatzuntermenge und schlüsselgeordnete Regel

Wenn Sie ein Zuordnungsschema angeben, das sql:relationship> verwendet<, bezieht sich der Teilmengeausdruck auf den Satz von Datensätzen, die auf der fremdseitigen Seite der Beziehung generiert werden. Im folgenden Beispiel befinden sich die CustOrder-Datensätze auf der fremden Seite , <sql:relationship>.

Nehmen Sie z. B. an, dass eine Datenbank die folgenden Tabellen enthält:

  • Cust (CustomerID, CompanyName, City)

  • CustOrder (CustomerID, OrderID)

Die CustomerID in der CustOrder-Tabelle ist ein Fremdschlüssel, der auf den CustomerID-Primärschlüssel in der Cust-Tabelle verweist.

Betrachten Sie jetzt die im folgenden XSD-Schema mit Anmerkungen angegebene XML-Sicht. Dieses Schema verwendet <"sql:relationship"> , um die Beziehung zwischen den Tabellen "Cust" und "CustOrder" anzugeben.

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

Die XML-Beispieldaten und die Schritte zum Erstellen eines funktionierenden Beispiels sind unten aufgeführt.

  • Wenn ein <Customer-Elementknoten> in der XML-Datendatei in den Bereich eintritt, generiert XML Bulk Load einen Datensatz für die Cust-Tabelle. XML-Massenladevorgang kopiert dann die erforderlichen Spaltenwerte (CustomerID, CompanyName und City) aus den <untergeordneten Elementen "CustomerID>",< "CompanyName>" und "<City>", wenn diese Elemente in den Bereich eingegeben werden.

  • Wenn ein <Order-Elementknoten> in den Bereich wechselt, generiert XML Bulk Load einen Datensatz für die CustOrder-Tabelle. XML-Massenladevorgang kopiert den Wert des OrderID-Attributs in diesen Datensatz. Der für die Spalte "CustomerID" erforderliche Wert wird aus dem untergeordneten Element "CustomerID>" des< Customer-Elements> abgerufen.< Xml-Massenladevorgang verwendet die Informationen, die in sql:relationship> angegeben sind, um den Fremdschlüsselwert "CustomerID" für diesen Datensatz abzurufen, es sei denn, das CustomerID-Attribut wurde im< Order-Element> angegeben.< Die allgemeine Regel lautet: Wenn das untergeordnete Element explizit einen Wert für das Fremdschlüssel-Attribut angibt, verwendet XML Bulk Load diesen Wert und ruft nicht den Wert aus dem übergeordneten Element mithilfe der angegebenen <sql:relationship> ab. Da dieser Knoten "<Order>"-Element den Gültigkeitsbereich überschreitet, sendet XML Bulk Load den Datensatz an SQL Server und verarbeitet dann alle nachfolgenden <Order-Elementknoten> auf die gleiche Weise.

  • Schließlich geht der Knoten " <Customer> "-Element außerhalb des Gültigkeitsbereichs. Zu diesem Zeitpunkt sendet XML Bulk Load den Kundendatensatz an SQL Server. Bei allen nachfolgenden Kunden im XML-Datenstrom wird nach demselben Prozess vorgegangen.

Zwei Beobachtungen zum Zuordnungsschema:

  • Wenn das Schema die Regel "Eindämmung" erfüllt (z. B. alle Daten, die dem Kunden zugeordnet sind und die Bestellung innerhalb des Bereichs der zugeordneten Knoten "Customer>" und< "Order>" definiert ist), wird die Massenlast erfolgreich ausgeführt.<

  • Bei der Beschreibung des <Customer-Elements> werden die untergeordneten Elemente in der entsprechenden Reihenfolge angegeben. In diesem Fall wird das <untergeordnete Element CustomerID> vor dem< untergeordneten Element Order> angegeben. Dies bedeutet, dass der CustomerID-Elementwert> in der Eingabe-XML-Datendatei als Fremdschlüsselwert verfügbar ist, wenn das< Order-Element> in den Bereich wechselt.< Die Schlüsselattribute werden gemäß der "Schlüsselsortierregel" zuerst angegeben.

    Wenn Sie das untergeordnete Element "CustomerID>" nach dem <untergeordneten Element "Order>" angeben, ist der Wert nicht verfügbar, wenn das< Order-Element> in den Bereich wechselt.< Wenn das <Endtag "/Order> " gelesen wird, wird der Datensatz für die CustOrder-Tabelle als abgeschlossen betrachtet und in die CustOrder-Tabelle mit einem NULL-Wert für die Spalte "CustomerID" eingefügt, was nicht das gewünschte Ergebnis ist.

So erstellen Sie ein funktionierendes Beispiel

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

  2. 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        int         PRIMARY KEY,  
                 CustomerID     int         FOREIGN KEY REFERENCES                                          Cust(CustomerID))  
    GO  
    
  3. Speichern Sie die folgenden XML-Eingabedaten unter dem Dateinamen SampleXMLData.xml:

    <ROOT>  
      <Customers>  
        <CustomerID>1111</CustomerID>  
        <CompanyName>Hanari Carnes</CompanyName>  
        <City>NY</City>   
        <Order OrderID="1" />  
        <Order OrderID="2" />  
      </Customers>  
    
      <Customers>  
        <CustomerID>1112</CustomerID>  
        <CompanyName>Toms Spezialitten</CompanyName>  
        <City>LA</City>  
        <Order OrderID="3" />  
      </Customers>  
      <Customers>  
        <CustomerID>1113</CustomerID>  
        <CompanyName>Victuailles en stock</CompanyName>  
        <Order OrderID="4" />  
    </Customers>  
    </ROOT>  
    
  4. Zum Ausführen des XML-Massenladevorgangs speichern und ausführen Sie das folgende Beispiel für Microsoft Visual Basic Scripting Edition (VBScript) (BulkLoad.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.Execute "c:\SampleSchema.xml", "c:\SampleXMLData.xml"  
    set objBL=Nothing  
    

Ausnahmen von der Datensatzgenerierungsregel

Gelangt ein Knoten vom Typ IDREF oder IDREFS in den Bereich, wird kein Datensatz generiert. Stellen Sie sicher, dass an irgendeiner Stelle im Schema eine vollständige Beschreibung des Datensatzes vorhanden ist. Die dt:type="nmtokens" -Anmerkungen werden genauso ignoriert, wie der IDREFS-Typ ignoriert wird.

Betrachten Sie z. B. das folgende XSD-Schema, das Die Elemente "Customer>" und< "Order>" <beschreibt. Das <Customer-Element> enthält ein OrderList-Attribut des IDREFS-Typs. Das <sql:relationship-Tag> gibt die 1:n-Beziehung zwischen dem Kunden und der Liste der Bestellungen an.

Das ist das Schema:

<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:attribute name="CustomerID" type="xsd:integer" />  
    <xsd:attribute name="CompanyName" type="xsd:string" />  
    <xsd:attribute name="City" type="xsd:string" />  
    <xsd:attribute name="OrderList"   
                       type="xsd:IDREFS"   
                       sql:relation="CustOrder"   
                       sql:field="OrderID"  
                       sql:relationship="CustCustOrder" >  
    </xsd:attribute>  
  </xsd:complexType>  
 </xsd:element>  
  
  <xsd:element name="Order" sql:relation="CustOrder" >  
   <xsd:complexType>  
    <xsd:attribute name="OrderID" type="xsd:string" />  
    <xsd:attribute name="CustomerID" type="xsd:integer" />  
    <xsd:attribute name="OrderDate" type="xsd:date" />  
  </xsd:complexType>  
 </xsd:element>  
</xsd:schema>  

Da die Massenlast die Knoten des IDREFS-Typs ignoriert, gibt es keine Datensatzgenerierung, wenn der OrderList-Attributknoten in den Bereich wechselt. Um die Auftragsdatensätze der Orders-Tabelle hinzuzufügen, müssen Sie demnach diese Aufträge irgendwo im Schema beschreiben. In diesem Schema wird durch Angeben des <Order-Elements> sichergestellt, dass xml-Massenladevorgang die Bestelldatensätze zur Tabelle Orders hinzufügt. Das <Order-Element> beschreibt alle Attribute, die zum Ausfüllen des Datensatzes für die CustOrder-Tabelle erforderlich sind.

Sie müssen sicherstellen, dass die Werte CustomerID und OrderID im <Customer-Element> den Werten im< Order-Element> entsprechen. Sie sind verantwortlich für die Wahrung der referenziellen Integrität.

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),  
                  OrderDate      datetime DEFAULT '2000-01-01')  
    GO  
    
  2. Speichern Sie das in diesem Beispiel bereitgestellte Zuordnungsschema unter dem Dateinamen SampleSchema.xml.

  3. Speichern Sie die folgenden XML-Daten unter dem Dateinamen SampleXMLData.xml:

    <ROOT>  
      <Customers CustomerID="1111" CompanyName="Sean Chai" City="NY"  
                 OrderList="Ord1 Ord2" />  
      <Customers CustomerID="1112" CompanyName="Dont Know" City="LA"  
                 OrderList="Ord3 Ord4" />  
      <Order OrderID="Ord1" CustomerID="1111" OrderDate="1999-01-01" />  
      <Order OrderID="Ord2" CustomerID="1111" OrderDate="1999-02-01" />  
      <Order OrderID="Ord3" CustomerID="1112" OrderDate="1999-03-01" />  
      <Order OrderID="Ord4" CustomerID="1112" OrderDate="1999-04-01" />  
    </ROOT>  
    
  4. Speichern Sie dieses VBScript-Beispiel (SampleVB.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.Execute "c:\SampleSchema.xml", "c:\SampleXMLData.xml"  
    set objBL=Nothing