Bagikan melalui


Proses Pembuatan Rekaman (SQLXML 4.0)

Berlaku untuk: SQL ServerAzure SQL Database

Pemuatan Massal XML memproses data input XML dan menyiapkan rekaman untuk tabel yang sesuai di Microsoft SQL Server. Logika dalam Beban Massal XML menentukan kapan harus menghasilkan rekaman baru, elemen turunan atau nilai atribut apa yang akan disalin ke bidang rekaman, dan kapan rekaman selesai dan siap dikirim ke SQL Server untuk disisipkan.

Pemuatan Massal XML tidak memuat seluruh data input XML ke dalam memori, dan tidak menghasilkan kumpulan catatan lengkap sebelum mengirim data ke SQL Server. Ini karena data input XML bisa menjadi dokumen besar dan memuat seluruh dokumen dalam memori bisa mahal. Sebagai gantinya, Pemuatan Massal XML melakukan hal berikut:

  1. Menganalisis skema pemetaan dan menyiapkan rencana eksekusi yang diperlukan.

  2. Menerapkan rencana eksekusi ke data dalam aliran input.

Pemrosesan berurutan ini membuatnya penting untuk menyediakan data input XML dengan cara tertentu. Anda harus memahami bagaimana BEBAN Massal XML menganalisis skema pemetaan dan bagaimana proses pembuatan rekaman terjadi. Dengan pemahaman ini, Anda dapat memberikan skema pemetaan ke Beban Massal XML yang menghasilkan hasil yang Anda inginkan.

Beban Massal XML menangani anotasi skema pemetaan umum, termasuk pemetaan kolom dan tabel (ditentukan secara eksplisit dengan menggunakan anotasi atau secara implisit melalui pemetaan default), dan hubungan gabungan.

Catatan

Diasumsikan bahwa Anda terbiasa dengan skema pemetaan XSD atau XDR yang dianotasi. Untuk informasi selengkapnya tentang skema, lihat Pengenalan Skema XSD Terannotasi (SQLXML 4.0) atau Skema XDR Anotasi (Tidak digunakan lagi di SQLXML 4.0).

Memahami pembuatan rekaman memerlukan pemahaman konsep berikut:

  • Cakupan simpul

  • Aturan Pembuatan Rekaman

  • Merekam subset dan Aturan Pengurutan Kunci

  • Pengecualian untuk Aturan Pembuatan Rekaman

Cakupan Simpul

Simpul (elemen atau atribut) dalam dokumen XML masuk ke dalam cakupan saat Beban Massal XML menemukannya di aliran data input XML. Untuk node elemen, tag awal elemen membawa elemen dalam cakupan. Untuk node atribut, nama atribut membawa atribut dalam cakupan.

Simpul meninggalkan cakupan ketika tidak ada lagi data untuk itu: baik di tag akhir (dalam kasus node elemen) atau di akhir nilai atribut (dalam kasus node atribut).

Aturan Pembuatan Rekaman

Ketika node (elemen atau atribut) masuk ke dalam cakupan, ada potensi untuk menghasilkan rekaman dari simpul tersebut. Catatan hidup selama node terkait berada dalam cakupan. Ketika simpul keluar dari cakupan, Beban Massal XML menganggap rekaman yang dihasilkan lengkap (dengan data) dan mengirimkannya ke SQL Server untuk dimasukkan.

Misalnya, pertimbangkan fragmen skema XSD berikut:

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

Skema menentukan <elemen Pelanggan> dengan atribut CustomerID dan CompanyName. Anotasi sql:relation memetakan <elemen Pelanggan> ke tabel Pelanggan.

Pertimbangkan fragmen dokumen XML ini:

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

Ketika Beban Massal XML disediakan dengan skema yang dijelaskan dalam paragraf sebelumnya dan data XML sebagai input, xml memproses simpul (elemen dan atribut) dalam data sumber sebagai berikut:

  • Tag awal elemen Pelanggan> pertama <membawa elemen tersebut dalam cakupan. Simpul ini memetakan ke tabel Pelanggan. Oleh karena itu, Beban Massal XML menghasilkan rekaman untuk tabel Pelanggan.

  • Dalam skema, semua atribut <peta elemen Pelanggan> ke kolom tabel Pelanggan. Saat atribut ini masuk ke dalam cakupan, Beban Massal XML menyalin nilainya ke catatan pelanggan yang sudah dihasilkan oleh cakupan induk.

  • Ketika Beban Massal XML mencapai tag akhir untuk <elemen Pelanggan> , elemen keluar dari cakupan. Ini menyebabkan Pemuatan Massal XML mempertimbangkan catatan selesai dan mengirimkannya ke SQL Server.

Pemuatan Massal XML mengikuti proses ini untuk setiap elemen Pelanggan> berikutnya<.

Penting

Dalam model ini, karena rekaman disisipkan ketika tag akhir tercapai (atau simpul berada di luar cakupan), Anda harus menentukan semua data yang terkait dengan rekaman dalam cakupan simpul.

Subset Rekaman dan Aturan Pengurutan Kunci

Saat Anda menentukan skema pemetaan yang menggunakan <sql:relationship>, istilah subset mengacu pada kumpulan rekaman yang dihasilkan di sisi asing hubungan. Dalam contoh berikut, rekaman CustOrder berada di sisi asing, <sql:relationship>.

Misalnya, database berisi tabel berikut:

  • Cust (CustomerID, CompanyName, City)

  • CustOrder (CustomerID, OrderID)

CustomerID dalam tabel CustOrder adalah kunci asing yang mengacu pada kunci primer CustomerID dalam tabel Cust.

Sekarang, pertimbangkan tampilan XML seperti yang ditentukan dalam skema XSD anotasi berikut. Skema ini menggunakan <sql:relationship> untuk menentukan hubungan antara tabel Cust dan 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>  

Contoh data XML dan langkah-langkah untuk membuat sampel kerja diberikan di bawah ini.

  • <Saat node elemen Pelanggan> dalam file data XML masuk ke dalam cakupan, Beban Massal XML menghasilkan rekaman untuk tabel Cust. Beban Massal XML kemudian menyalin nilai kolom yang diperlukan (CustomerID, CompanyName, dan City) dari <elemen CustomerID>,< CompanyName>, dan< City> child saat elemen-elemen ini masuk ke dalam cakupan.

  • <Saat node elemen Order> masuk ke dalam cakupan, Beban Massal XML menghasilkan rekaman untuk tabel CustOrder. Muat Massal XML menyalin nilai atribut OrderID ke rekaman ini. Nilai yang diperlukan untuk kolom CustomerID diperoleh dari elemen turunan CustomerID> dari <elemen Pelanggan>.< Beban Massal XML menggunakan informasi yang ditentukan dalam sql:relationship> untuk mendapatkan nilai kunci asing CustomerID untuk rekaman ini, kecuali atribut CustomerID ditentukan dalam< elemen Pesanan>.< Aturan umumnya adalah bahwa jika elemen turunan secara eksplisit menentukan nilai untuk atribut kunci asing, Beban Massal XML menggunakan nilai tersebut dan tidak mendapatkan nilai dari elemen induk dengan menggunakan sql:relationship> yang ditentukan<. Saat node elemen Order> ini< keluar dari cakupan, Beban Massal XML mengirimkan rekaman ke SQL Server dan kemudian memproses semua node elemen Order> berikutnya <dengan cara yang sama.

  • Akhirnya, <node elemen Pelanggan> keluar dari cakupan. Pada saat itu, Beban Massal XML mengirimkan catatan pelanggan ke SQL Server. Beban Massal XML mengikuti proses ini untuk semua pelanggan berikutnya dalam aliran data XML.

Berikut adalah dua pengamatan tentang skema pemetaan:

  • Ketika skema memenuhi aturan "penahanan" (misalnya, semua data yang terkait dengan pelanggan dan pesanan ditentukan dalam cakupan node elemen Pelanggan> dan< Pesanan> terkait<), beban massal berhasil.

  • Dalam menjelaskan <elemen Pelanggan> , elemen turunannya ditentukan dalam urutan yang sesuai. Dalam hal ini, elemen turunan CustomerID> ditentukan sebelum elemen Anak pesanan><.< Ini berarti bahwa dalam file data XML input, <nilai elemen CustomerID> tersedia sebagai nilai kunci asing saat< elemen Pesanan> masuk ke dalam cakupan. Atribut kunci ditentukan terlebih dahulu; ini adalah "Aturan Pengurutan Kunci."

    Jika Anda menentukan <elemen turunan CustomerID> setelah< elemen Anak pesanan>, nilai tidak tersedia saat <elemen Pesanan> masuk ke dalam cakupan. <Ketika tag akhir /Order> kemudian dibaca, rekaman untuk tabel CustOrder dianggap selesai dan disisipkan dalam tabel CustOrder dengan nilai NULL untuk kolom CustomerID, yang bukan hasil yang diinginkan.

Untuk membuat sampel kerja

  1. Simpan skema yang disediakan dalam contoh ini sebagai SampleSchema.xml.

  2. Buat tabel ini:

    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. Simpan contoh data input XML berikut sebagai 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. Untuk menjalankan Pemuatan Massal XML, simpan dan jalankan contoh Microsoft Visual Basic Scripting Edition (VBScript) berikut (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  
    

Pengecualian untuk Aturan Pembuatan Rekaman

Beban Massal XML tidak menghasilkan rekaman untuk simpul saat masuk ke dalam cakupan jika simpul tersebut adalah jenis IDREF atau IDREFS. Anda harus memastikan bahwa deskripsi lengkap rekaman terjadi di beberapa tempat dalam skema. Anotasi dt:type="nmtokens" diabaikan sama seperti jenis IDREFS diabaikan.

Misalnya, pertimbangkan skema XSD berikut yang menjelaskan elemen Pelanggan> dan <Pesanan>.< Elemen <Pelanggan> menyertakan atribut OrderList dari jenis IDREFS. <Tag sql:relationship> menentukan hubungan satu-ke-banyak antara pelanggan dan daftar pesanan.

Ini adalah skema:

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

Karena Beban Massal mengabaikan simpul jenis IDREFS, tidak ada pembuatan rekaman saat node atribut OrderList masuk ke dalam cakupan. Oleh karena itu, jika Anda ingin rekaman pesanan ditambahkan ke tabel Pesanan, Anda harus menjelaskan pesanan tersebut di suatu tempat dalam skema. Dalam skema ini, menentukan elemen Pesanan <> memastikan bahwa Beban Massal XML menambahkan rekaman pesanan ke tabel Pesanan. Elemen <Order> menjelaskan semua atribut yang diperlukan untuk mengisi rekaman untuk tabel CustOrder.

Anda harus memastikan bahwa nilai CustomerID dan OrderID di <elemen Pelanggan> cocok dengan nilai dalam elemen Pesanan<>. Anda bertanggung jawab untuk mempertahankan integritas referensial.

Untuk menguji sampel yang berfungsi

  1. Buat tabel ini:

    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. Simpan skema pemetaan yang disediakan dalam contoh ini sebagai SampleSchema.xml.

  3. Simpan contoh data XML berikut sebagai 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. Untuk menjalankan Pemuatan Massal XML, simpan dan jalankan contoh VBScript ini (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