Freigeben über


Datensatzgenerierungsprozess (SQLXML 4.0)

Gilt für:SQL ServerAzure SQL-Datenbank

XML Bulk Load verarbeitet die XML-Eingabedaten und bereitet Datensätze für die entsprechenden Tabellen in Microsoft SQL Server vor. Die Logik im XML-Massenladen 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 und zum Einfügen an SQL Server gesendet werden kann.

Xml Bulk Load 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 unter Introduction to Annotated XSD Schemas (SQLXML 4.0) or Annotated 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 Attribut) in einem XML-Dokument tritt in den Bereich ein, wenn xml Bulk Load ihn im XML-Eingabedatenstrom trifft. 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 aus dem Bereich ausfällt, betrachtet XML-Massenladen den generierten Datensatz als abgeschlossen (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 den Attributen CustomerID und CompanyName an. Die anmerkung sql:relation 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 werden 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 das XML-Massenladen das Endtag für das <Customer-Element> erreicht, wird der Gültigkeitsbereich für das Element nicht mehr erreicht. Dies führt dazu, dass das XML-Massenladen den Datensatz als abgeschlossen betrachtet und an SQL Server gesendet wird.

Xml-Massenladen 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.

Datensatzteilmenge und Schlüsselreihenfolgeregel

Wenn Sie ein Zuordnungsschema angeben, das sql:relationship> verwendet<, bezieht sich der Teilmengenbegriff auf den Satz von Datensätzen, der auf der Fremdseite der Beziehung generiert wird. Im folgenden Beispiel befinden sich die CustOrder-Datensätze auf der fremdsprachigen 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-Massenladen 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 eintritt, generiert XML Bulk Load einen Datensatz für die CustOrder-Tabelle. XML Bulk Load kopiert den Wert des OrderID-Attributs in diesen Datensatz. Der für die Spalte CustomerID erforderliche Wert wird aus dem <untergeordneten CustomerID-Element> des <Customer-Elements> abgerufen. XML-Massenladen verwendet die in <sql:relationship> angegebenen Informationen, um den CustomerID-Fremdschlüsselwert 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 den Wert nicht aus dem übergeordneten Element mithilfe der angegebenen <sql:relationship> ab. Wenn dieser <Order-Elementknoten> aus dem Bereich ausläuft, sendet XML-Massenladen den Datensatz an SQL Server und verarbeitet dann alle nachfolgenden <Order-Elementknoten> auf die gleiche Weise.

  • Schließlich wird der <Knoten customer-Element> nicht mehr in den Gültigkeitsbereich verschoben. Zu diesem Zeitpunkt sendet XML-Massenladen 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 "Containment" erfüllt (z. B. alle Daten, die dem Kunden zugeordnet sind und die Bestellung innerhalb des Bereichs der zugeordneten <Customer> - und <Order-Elementknoten> definiert ist), ist die Massenladung erfolgreich.

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

    Wenn Sie das <untergeordnete CustomerID-Element> nach dem <untergeordneten Order-Element> angeben, ist der Wert nicht verfügbar, wenn das Order-Element> in den< Bereich eintritt. Wenn das <Endtag /Order> dann gelesen wird, gilt der Datensatz für die CustOrder-Tabelle als abgeschlossen und wird 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-Massenladens 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 ignoriert, während der IDREFS-Typ ignoriert wird.

Betrachten Sie beispielsweise 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 massenladen die Knoten des IDREFS-Typs ignoriert, gibt es keine Datensatzgenerierung, wenn der OrderList-Attributknoten in den Bereich eintritt. Um die Auftragsdatensätze der Orders-Tabelle hinzuzufügen, müssen Sie demnach diese Aufträge irgendwo im Schema beschreiben. In diesem Schema stellt die Angabe des <Order-Elements> sicher, dass xml Bulk Load die Auftragsdatensätze der Tabelle Orders hinzufügt. Das <Order-Element> beschreibt alle Attribute, die zum Füllen des Datensatzes für die CustOrder-Tabelle erforderlich sind.

Sie müssen sicherstellen, dass die Werte CustomerID und OrderID im <Customer-Element> mit den Werten im <Order-Element> übereinstimmen. 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