Udostępnij za pośrednictwem


Proces tworzenia rekordu (SQLXML 4.0)

XML ładowanie zbiorcze przetwarza dane wejściowe XML i przygotowuje rekordów do odpowiednich tabel w programie Microsoft SQL Server. Logikę XML ładowanie zbiorcze Określa, kiedy można wygenerować nowego rekordu, jaki element podrzędność lub atrybut wartości do skopiowania do pól rekordu, a rekord jest kompletny i gotowy do wysłania do SQL Server do wstawiania.

XML ładowanie zbiorcze całej dane wejściowe XML nie zostanie załadowana do pamięci i nie daje pełnej zestawy rekordów przed wysłaniem danych do SQL Server. Dzieje się tak, ponieważ wejściowe dane XML mogą być dużego dokumentu i ładowanie w całym dokumencie, w pamięci może być kosztowne.Zamiast tego XML ładowanie zbiorcze wykonuje następujące czynności:

  1. Analizuje mapowanie schematu i przygotowuje plan wykonania konieczne.

  2. Plan wykonania stosuje do danych w strumieniu wejściowym.

Umożliwia to przetwarzanie sekwencyjne ważne, aby dostarczyć dane wejściowe XML w określony sposób.Należy zrozumieć jak obciążenia zbiorcze XML analizuje mapowanie schematu i w jaki sposób występuje proces generowania rekordów.Ten opis można udostępniać schematu mapowania XML ładowanie zbiorcze daje żądanych wyniki.

XML ładowanie zbiorcze obsługi typowych mapowania adnotacji schematu, łącznie z kolumna tabela mapowania (określone jawnie za pomocą adnotacji lub niejawnie za pośrednictwem domyślnego odwzorowania) i dołączyć relacji.

Uwaga

Zakłada się, że czytelnik jest obeznany z adnotacjami XSD lub XDR mapowania schematów.Aby uzyskać więcej informacji na temat schematów zobacz Wprowadzenie do adnotacjami schematy XSD (SQLXML 4.0) lub Adnotacjami schematy XDR (zaniechana w SQLXML 4.0).

Opis rekordu generowania wymaga Opis pojęć związanych z następujących czynności:

  • Zakres węzła

  • Zasady tworzenia rekordu

  • podzbiór rekordów i reguły zamawiania klucz

  • Wyjątki od reguły generowania rekordu

Zakres węzła

Wprowadza węzła (element lub atrybut) w dokumencie XML do zakres , kiedy wykryje go XML ładowanie zbiorcze w strumieniu dane wejściowe XML.Dla węzła programu elementu tag początkowy elementu przenosi element zakres.Nazwa atrybut dla węzła atrybut programu powoduje atrybut zakres.

Węzeł pozostawia zakres, gdy nie ma więcej danych dla niego: zarówno w tagu końcowego (z wyjątkiem węzeł elementu) lub na końcu wartość atrybut (z wyjątkiem węzeł atrybut).

Zasady tworzenia rekordu

Gdy węzeł (element lub atrybut) wprowadza do zakres, istnieje możliwość generowania rekordu z tego węzła.Rekord mieszka tak długo, jak skojarzony węzeł jest w zakres.Gdy węzeł przechodzi z zakres, XML ładowanie zbiorcze traktuje rekord wygenerowanych (wraz z danych) i wysyła go do SQL Server do wstawiania.

Na przykład rozważmy poniższy fragment schematu XSD:

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

Określa schemat <Odbiorcy> element o Identyfikator klienta and CompanyName atrybuty.The sql:relation annotation maps the <Customer> element to the Customers tabela.

Należy wziąć pod uwagę ten fragment dokumentu XML:

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

Gdy XML ładowanie zbiorcze jest pod warunkiem, że ze schematem opisane w poprzednich akapitów i dane XML jako danych wejściowych, przetwarza węzłów (elementy i atrybuty) w danych źródłowych w następujący sposób:

  • The start tag of the first <Customer> element brings that element in scope.Ten węzeł jest mapowany do tabela Klienci.Dlatego XML ładowanie zbiorcze generuje rekord w tabela Klienci.

  • W schemacie, wszystkie atrybuty <Odbiorcy> Mapa element do kolumn z tabela Klienci. Jak wprowadzić te atrybuty do zakresu, XML ładowanie zbiorcze kopiuje ich wartości do rekordu klienta, który już jest generowany przez zakres obiektu nadrzędnego.

  • Gdy XML ładowanie zbiorcze osiągnie tag końcowy dla <Odbiorcy> elementu, element wykracza poza zakres. Powoduje to, że XML zbiorcze obciążenia należy wziąć pod uwagę rekord kompletne i wysłać go do SQL Server.

XML ładowanie zbiorcze następuje ten proces dla każdego kolejnego <Odbiorcy> element.

Important noteImportant Note:

W tym modelu ponieważ rekord zostanie wstawiony po osiągnięciu tagu końcowego (lub węzeł jest poza zakresem), należy zdefiniować wszystkie dane, które są skojarzone z rekordu w zakresie węzła.

Podzbiór rekordów i klucz zamawiania reguły

Po określeniu schematu mapowania, która korzysta z <sql:relationship>, termin podzbiór odnosi się do zestaw rekordów jest generowany na stronie obcego relacji. W poniższym przykładzie rekordy CustOrder są po stronie obcych <sql:relationship>.

Na przykład załóżmy, że baza danych zawiera następujące tabele:

  • Cust (identyfikator klienta, NazwaFirmy, Miasto)

  • CustOrder (identyfikator klienta, identyfikator zamówienia)

Identyfikator klienta w tabela CustOrder jest klucz obcy, która odwołuje się do klucz podstawowy IDKlienta w tabela Cust.

Teraz należy wziąć pod uwagę Widok XML, jak określono w następujących adnotacjami schematu XSD.Korzysta z tego schematu <sql:relationship> Aby określić relację między tabelami Cust i CustOrder.

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

Poniżej podano przykładowe dane XML i czynności, aby utworzyć próbę pracy.

  • Gdy <Odbiorcy> węzeł elementu w pliku danych XML wchodzi w zakres, XML ładowanie zbiorcze generuje rekord w tabela Cust. XML ładowanie zbiorcze następnie kopiuje wartości kolumn niezbędne (identyfikator klienta, NazwaFirmy i Miasto) <Identyfikator klienta>, <CompanyName>, a także <Miasto> elementy podrzędność, jak te elementy należy wprowadzić do zakres.

  • When an <Order> element node enters into scope, XML Bulk Load generates a record for the CustOrder table.XML ładowanie zbiorcze kopiuje wartości Identyfikator zamówienia atrybut do tego rekordu.Wartość wymagana kolumna IDKlienta są uzyskiwane z <Identyfikator klienta> element podrzędność <Odbiorcy> element. XML Bulk Load uses the information that is specified in <sql:relationship> to obtain the CustomerID foreign key value for this record, unless the CustomerID attribute was specified in the <Order> element.Ogólną zasadą jest, że jeśli element podrzędność jawnie określa wartość dla atrybut klucz obcy, XML ładowanie zbiorcze używa tej wartości i nie uzyskać wartości z elementu nadrzędnego przy użyciu określonego <sql:relationship>. Co to <Zamówienia> węzeł elementu wykracza poza zakres, rekord, który wysyła XML ładowanie zbiorcze SQL Server następnie procesów wszystkich kolejnych i <Zamówienia> element węzły w taki sam sposób.

  • Wreszcie <Odbiorcy> węzeł elementu wykracza poza zakres. W tym czasie XML ładowanie zbiorcze wysyła do rekordu klienta SQL Server. XML ładowanie zbiorcze poniżej ten proces dla wszystkich kolejnych odbiorców w strumieniu danych XML.

Oto dwie uwagi dotyczące mapowania schematu:

  • Gdy schemat spełnia regułę "zamknięcia" (na przykład, wszystkie dane, które jest skojarzone z klienta i zamówienia definiuje się w zakresie skojarzonym <Odbiorcy> i <Zamówienia> węzły elementu) ładowanie zbiorcze zakończy się pomyślnie.

  • W opisujący <Odbiorcy> element, jego podrzędność elementów są określone w odpowiedniej kolejności. W takim przypadek <Identyfikator klienta> element podrzędność zostanie określona przed <Zamówienia> element podrzędność. Oznacza to, że w pliku danych wejściowych XML, <Identyfikator klienta> wartość elementu jest dostępna jako klucz obcy podczas wartość <Zamówienia> element wchodzi w zakres. Atrybuty klucz są określane jako pierwsze; jest to "Reguły zamawianie klucz."

    If you specify the <CustomerID> child element after the <Order> child element, the value is not available when the <Order> element enters into scope.Gdy </ Zamówienia> tag końcowy jest następnie odczytu, rekord do tabela CustOrder uznana za zakończoną i dodaje się w tabela CustOrder o wartości NULL dla kolumna Identyfikator klienta, który nie jest pożądany wynik.

Aby utworzyć próbę pracy

  1. Zapisz schemat, który znajduje się w tym przykładzie jako SampleSchema.xml.

  2. Utwórz następujące tabele:

    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. Zapisz następujące dane wejściowe XML próbki jako 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. Wykonanie XML ładowanie zbiorcze, zapisywania i wykonać następujące czynności Microsoft Przykład kodu języka Visual Basic wykonywanie skryptów 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
    

Wyjątki od reguły generowania rekordu

Po wejściu do zakres w przypadku danego węzła typu pakietu IDREF lub IDREFS XML ładowanie zbiorcze nie generuje rekord dla węzła.Użytkownik powinien upewnić się, że pełny opis rekord występuje w miejscu w schemacie.The dt:type="nmtokens" annotations are ignored just as the IDREFS type is ignored.

Na przykład należy wziąć pod uwagę następujące schematu XSD, który opisuje <Odbiorcy> i <Zamówienia> elementy. The <Customer> element includes an OrderList atrybut of the IDREFS type.The <sql:relationship> tag specifies the one-to-many relationship between the customer and list of orders.

Jest to schemat:

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

Ponieważ ładowanie zbiorcze ignoruje węzłów typu IDREFS, nie ma żadnych rekordów generowania podczas OrderList węzeł atrybut wchodzi w zakres.Dlatego zapisy zlecenia dodawane do tabela zamówienia, należy musi zawierać opis tych zamówień w dowolnym miejscu w schemacie.W tym schemacie Określanie <Zamówienia> element gwarantuje, że XML ładowanie zbiorcze dodaje kolejność rekordów do tabela zamówienia. The <Order> element describes all the attributes that are required to fill the record for the CustOrder tabela.

Należy się upewnić, że Identyfikator klienta and Identyfikator zamówienia wartości**<Odbiorcy>** element pasują do wartości w <Zamówienia> element. Użytkownik jest odpowiedzialny za zachowanie więzów integralność.

Aby testować przykładowe pracy

  1. Utwórz następujące tabele:

    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. Zapisywanie schematu mapowania, w tym przykładzie jako SampleSchema.xml.

  3. Następujące przykładowe dane XML można zapisać jako 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. Aby wykonać XML ładowanie zbiorcze, zapisywania i wykonywania w tym przykładzie VBScript (SampleVB.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