Udostępnij przez


Proces generowania rekordu (SQLXML 4.0)

Ładowanie danych XML luzem przetwarza dane wejściowe XML i przygotowuje rekordów do odpowiednich tabel w programie Microsoft SQL Server.Logikę XML luzem obciążenia określa czas generowania nowego rekordu, co element lub atrybut wartości podrzędność skopiować do pola rekordu, a rekord jest zakończenie i gotowe do wysłania do SQL Server do wstawiania.

Załadować luzem XML nie ładuje całego wejściowe dane XML do pamięci i nie produkuje kompletne zestawy rekordów przed wysłaniem danych do SQL Server.Jest tak, ponieważ wejściowe dane XML można dużego dokumentu i ładowanie całego dokumentu w pamięci może być kosztowna.Zamiast tego obciążenia luzem XML wykonuje następujące czynności:

  1. Analizuje mapowanie schematu i przygotowuje plan wykonania niezbędnych.

  2. Stosuje się plan wykonania danych w strumień wejściowy.

To przetwarzanie sekwencyjne sprawia, że ważne zapewnienie wejściowe dane XML w określony sposób.Należy zrozumieć jak obciążenia luzem XML analizuje mapowanie schematu i jak proces generowania rekordu występuje.Ten opis można udostępnić obciążenia luzem XML, który daje wyniki mają schematu mapowania.

Obciążenia luzem XML obsługuje wspólnej mapowania adnotacje schematu, włącznie z kolumna i tabela mapowań (określone jawnie za pomocą adnotacji lub niejawnie przez mapowanie domyślne), i łączyć relacji.

Ostrzeżenie

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 schematów XSD (SQLXML 4.0) lub Adnotacjami schematy XDR (zaniechane w SQLXML 4.0).

Opis rekordu generacji wymaga zrozumienia następujące pojęcia:

  • Zakres węzła

  • Rekord pokolenia reguły

  • Podzbiór rekordów i reguły zamawiania klucza

  • Wyjątki od zasady generacji rekordu

Zakres węzła

Wprowadza węzła (element lub atrybut) w dokumencie XML do zakres podczas obciążenia luzem XML napotka ją w strumieniu XML danych wejściowych.Dla węzeł elementu tagu początkowym elementu Przesuwa element zakres.Dla węzła atrybut nazwy atrybut przełącza atrybut zakres.

Węzeł pozostawia zakres, gdy nie ma więcej danych dla niego: albo w tagu końcowego (w przypadek węzła element) lub na końcu wartość atrybut (w przypadek z węzłem atrybutów).

Rekord pokolenia reguły

Gdy węzeł (element lub atrybut) wchodzi w zakres, istnieje możliwość generowania rekord tego węzła.Rekord mieszka jak skojarzony węzeł jest w zakres.Gdy węzeł wykracza poza zakres, obciążenia luzem XML uzna wygenerowanych rekordu (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 <klienta> element z IDklienta i NazwaFirmy atrybuty.sql:relation Mapy adnotacji <klienta> element z tabela Klienci.

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

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

Podczas ładowania luzem XML jest pod warunkiem, że ze schematem opisane w poprzednich ustępach i danych XML jako danych wejściowych, przetwarza węzłów (elementy i atrybuty) w źródło danych w następujący sposób:

  • The start tag of the first <Customer> element brings that element in scope.Ten węzeł jest mapowany na tabela Klienci.Dlatego obciążenia luzem XML generuje rekord w tabela Klienci.

  • W schemacie, wszystkie atrybuty <klienta> mapy element do kolumn z tabela Klienci.Wprowadzania tych atrybutów do zakres, obciążenia luzem XML kopiuje ich wartości do rekordu klienta, już generowany przez zakres nadrzędnego.

  • Kiedy obciążenia luzem XML osiąga znacznik końca <klienta> elementu, element wykracza poza zakres.Powoduje to XML luzem obciążenia na rozważenie pełnej rekordu i wysłać go do SQL Server.

Obciążenia luzem XML następuje ten proces dla każdego kolejnego <klienta> elementu.

Ważna informacjaWażne:

W tym modelu, ponieważ dodaje rekord po tagu końcowego osiągnięciu (lub węzeł jest z zakres), należy zdefiniować wszystkie dane skojarzone z rekordem w zakres węzła.

Podzbiór rekordów i klucza, zamawiania reguły

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

Załóżmy, że baza danych zawiera następujące tabele:

  • NABYW (IDklienta NazwaFirmy, Miasto)

  • CustOrder (IDklienta, IDZamówienia)

To IDKlienta w tabela CustOrder klucz obcy odwołujący się do klucz podstawowy IDKlienta w tabela Nabywca.

Rozważmy Widok XML, jak określono w następujących adnotacjami schematu XSD.Używa tego schematu <sql:relationship> do określania relacji 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 w celu utworzenia próbki roboczej.

  • Gdy <klienta> węzeł elementu w pliku danych XML wchodzi w zakres, obciążenia luzem XML generuje rekord w tabela Nabywca.Obciążenia luzem XML następnie kopiuje niezbędnych kolumna wartości (IDklienta, NazwaFirmy i Miasto) z <IDklienta>, **<NazwaFirmy>**oraz <miasta> elementów podrzędność, jak te elementy wejść w zakres.

  • When an <Order> element node enters into scope, XML Bulk Load generates a record for the CustOrder table.Ładowanie danych XML luzem kopiuje wartość IDZamówienia atrybut do tego rekordu.Wartość wymagana kolumna IDKlienta jest otrzymanego z <IDklienta> element podrzędność <klienta> elementu.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ść obcą atrybut klucza, obciążenia luzem XML używa tej wartości i nie uzyskania wartości z elementu nadrzędnego przy użyciu określonego <sql:relationship>.Jak to <zamówienia> węzeł elementu wykracza poza zakres, rekord, który wysyła obciążenia luzem XML SQL Server i przetwarza wszystkie kolejne <zamówienia> węzły elementów w taki sam sposób.

  • Wreszcie <klienta> węzeł elementu wykracza poza zakres.W tym czas, obciążenia luzem XML wysyła rekordu klienta, aby SQL Server.Ładowanie danych XML luzem następuje ten proces dla wszystkich kolejnych odbiorców w strumieniu danych XML.

Oto dwie uwagi dotyczące mapowania schematu:

  • Gdy schemat spełnia "zawierania" reguły (na przykład wszystkie dane, które jest skojarzone z klientem i kolejność jest zdefiniowany w zakres stowarzyszonej <klienta> i <zamówienia> węzły elementów), powiedzie się obciążenia luzem.

  • Opisywanie <klienta> element, jego podrzędność elementów są określone w odpowiedniej kolejności.W takim przypadek <IDklienta> element podrzędność jest określona przed <zamówienia> elementu podrzędnego.Oznacza to, że w wejściowy plik danych XML <IDklienta> wartość elementu jest dostępna jako klucz obcy wartości, kiedy <zamówienia> element wchodzi w zakres.Atrybuty klucz są określone jako pierwszy; jest to "Klucz reguły zamawianie".

    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 </Order> tag końcowy jest odczytywany, rekord w tabela CustOrder uznane za kompletne i dodaje się w tabela CustOrder o wartości NULL kolumna IDKlienta, w którym nie stanowi żądanych wyników.

Tworzenie próbki roboczej

  1. Zapisz schemat, który jest dostarczany w tym przykładzie jako SampleSchema.xml.

  2. Tworzenie tych tabel:

    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. wykonać XML obciążenia luzem, Zapisz i wykonaj następujące Microsoft przykład 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
    

Wyjątki od zasady generacji rekordu

Po jej wejściu w zakres, jeśli taki węzeł jest typu IDREF albo IDREFS obciążenia luzem XML nie generuje rekord węzła.Należy upewnić się, że pełny opis rekordu występuje na miejscu w schemacie.dt:type="nmtokens" Adnotacje są ignorowane, podobnie jak typ IDREFS jest ignorowana.

Na przykład, rozważmy następujące schematu XSD, który opisuje <klienta> i <zamówienia> elementów.<Klienta> element zawiera OrderList atrybut typu IDREFS.<sql:relationship> Tag określa relację jeden do wielu między klientem a lista zleceń.

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ż obciążenia luzem ignoruje węzłów typu IDREFS, jest nie rekordów generacji po OrderList węzeł atrybut wchodzi w zakres.Dlatego ma rekordów zamówień dodane do tabela zamówienia musi opisywać tych zamówień gdzieś w schemacie.W tym schemacie Określanie <zamówienia> element gwarantuje, że obciążenia luzem XML dodaje kolejność rekordów do tabela zamówienia.<Zamówienia> element opisano wszystkie atrybuty, które są wymagane do wypełnienia rekordu w tabela CustOrder.

Musi zapewnić, że IDklienta i IDZamówienia wartości w <klienta> element odpowiadają w <zamówienia> elementu.Ponosisz odpowiedzialność za utrzymanie integralność referencyjnej.

Aby przetestować przykładowe pracy

  1. Tworzenie tych tabel:

    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. Zapisz schemat mapowanie, pod warunkiem że w tym przykładzie jako SampleSchema.xml.

  3. Zapisz następujące przykładowe dane XML 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. wykonać XML obciążenia luzem, Zapisz i wykonywać 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